如何从 django 中的视图向 ManyToManyField 提供数据

How to give data to ManyToManyField from view in django

你好,我是 django 的新手,我正在尝试创建一个页面,我们可以在其中添加和参与各种活动。

这是我为我的数据库创建的模型

model.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')

我在这里尝试通过点击 link 用户参与该活动来创建一个 link 但我不知道如何将用户数据放在上面的与会者字段中

查看函数

def attendees(request):
    Event.attendees.add(request.user)
    return redirect('list-events')

错误:/participate/ 处的属性错误 'ManyToManyDescriptor' 对象没有属性 'add'

link

<a href="{% url 'participate' %}">Participate</a>

url.py

path('participate/', attendees, name='participate')  

您需要为 指定将添加用户的 事件,因此视图应如下所示:

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 = <strong>get_object_or_404(</strong>Event<strong>, pk=pk)</strong>
    <strong>event</strong>.attendees.add(request.user)
    return redirect('list-events')

参与应该通过 POST 请求完成,因为它会改变实体。 GET 请求只能用于检索数据,而不是更新它。

urls.py 因此应该包含主键的 URL 参数:

path('participate/<strong><int:pk></strong>/', attendees, name='participate')

最后,模板应该向具有事件主键的路径发出 POST 请求:

<form method="post" action="{% url 'participate' <strong>pk=event.pk</strong> %}">
    <button type="submit">Participate</button>
<form>

Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].


Note: One can use the @require_POST decorator [Django-doc] to restrict the view to only be accessible for a POST request.


Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

这是最简单的方法。据我了解,Venue 模型由管理员(即您)保存。如果没有,那么您必须先保存场地。

现在关键是,在关系字段中,你必须传递整个继承模型对象。

你可以这样做:

#在登录视图中

def login(request):
   #your code
   request.session['userID']=userID
   #your code

现在您可以在任何视图或模板中使用会话变量(即用户 ID)

#参与观看

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())