【问题标题】:How to give data to ManyToManyField from view in django如何从 django 的视图中向 ManyToManyField 提供数据
【发布时间】:2022-01-19 10:54:53
【问题描述】:

您好,我是 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')

在这里我试图通过单击该链接用户参与该事件来建立一个链接 但我不知道如何将用户数据放在上述与会者字段中

查看功能

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

error : /participate/ 处的 AttributeError 'ManyToManyDescriptor' 对象没有属性 'add'

链接

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

url.py

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

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

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

    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/<strong>&lt;int:pk&gt;</strong>/', attendees, name='participate')

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

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

    注意:您可以使用 @login_required decorator [Django-doc].


    注意:可以使用@require_POST decorator [Django-doc] 将视图限制为仅可用于 POST 请求。


    注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

    【讨论】:

      【解决方案2】:

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

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

      你可以这样做:

      #在登录视图中

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

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

      #participate view

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

      【讨论】:

        猜你喜欢
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多