您好,我是 django 的新手,我正在嘗試創建一個頁面,我們可以在其中添加和參與各種活動。
這是我為我的資料庫創建的模型
模型.py
class Venue(models.Model):
name = models.CharField('Venue Name', max_length=120)
address = models.CharField(max_length=300)
zip_code = models.CharField('Zip Code', max_length=6)
phone = models.CharField('Contact Number', max_length=25, blank=True)
web = models.URLField('Website Address', blank=True)
email = models.EmailField('Email', blank=True)
owner = models.IntegerField('Venue Owner', blank=False, default=1)
venue_image = models.ImageField(null=True, blank=True, upload_to="images/")
class Event(models.Model):
name = models.CharField('Event Name', max_length=120)
event_date = models.DateTimeField('Event Date')
venue = models.ForeignKey(Venue, blank=True,null=True, on_delete=models.CASCADE)
manager = models.ForeignKey(User,blank=True,null=True,on_delete=models.SET_NULL)
description = models.TextField(blank=True, )
attendees = models.ManyToManyField(User,blank=True, related_name='attendees')
在這里,我試圖通過單擊該鏈接用戶參與該事件來建立一個鏈接,但我不知道如何將用戶資料放在上述與會者欄位中
查看功能
def attendees(request):
Event.attendees.add(request.user)
return redirect('list-events')
錯誤:/participate/ 'ManyToManyDescriptor' 物件的 AttributeError 沒有屬性 'add'
關聯
<a href="{% url 'participate' %}">Participate</a>
網址.py
path('participate/', attendees, name='participate')
uj5u.com熱心網友回復:
您需要指定將添加用戶的事件,因此視圖應如下所示:
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect
from django.views.decorators.http import require_POST
@require_POST
@login_required
def attendees(request, pk):
event = get_object_or_404(Event, pk=pk)
event.attendees.add(request.user)
return redirect('list-events')
參與應該通過 POST 請求完成,因為它會改變物體。GET 請求應該只用于檢索資料,而不是更新它。
因此urls.py應該包含主鍵的 URL 引數:
path('participate/<int:pk>/', attendees, name='participate')
最后,模板應該因此向帶有事件主鍵的路徑發出 POST 請求:
<form method="post" action="{% url 'participate' pk=event.pk %}">
<button type="submit">Participate</button>
<form>
注意:您可以使用
@login_required裝飾器 [Django-doc]將視圖限制為經過身份驗證的用戶的視圖 。
注意:可以使用
@require_POST裝飾器 [Django-doc] 將視圖限制為僅可用于 POST 請求。
注意:通常使用
settings.AUTH_USER_MODEL[Django-doc]參考用戶模型比直接使用User模型 [Django-doc]更好。有關更多資訊,您可以查看檔案的參考User模型部分。
uj5u.com熱心網友回復:
這是最簡單的方法。據我所知,Venue模型由管理員(即您)保存。如果沒有,那么您必須先保存場地。
現在的關鍵是,在關系欄位中,您必須傳遞整個繼承模型物件。
你可以這樣做:
#在登錄視圖中
def login(request):
#your code
request.session['userID']=userID
#your code
現在您可以在任何視圖或模板中使用會話變數(即 userID)
#參與視圖
from mymodels import Event,Venue
def participate(request):
#your GET or POST parameters here
user=user_model.objects.get(id=request.session['userID'])
venue=Venue.objects.get(id=venue_id) #OR filter it by any other field like name
E1=Event()
E1.attendees= user
E1.venue= venue
E1.manager= user
E1.name= name_from_request_parameters
E1.description= description_from_request_parameters
E1.event_date= event_date_from_request_parameters
E1.save()
提示:在日期欄位中使用默認當前日期,例如
event_date = models.DateTimeField(default=datetime.now())
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/416255.html
標籤:
