拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何从django的视图中向ManyToManyField提供资料

如何从django的视图中向ManyToManyField提供资料

白鹭 - 2022-02-10 2148 0 0

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



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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *