django 禁止直接分配到多对多集合的前向一侧。使用 user.set() 代替

问题描述 投票:0回答:1

嗨,我在 django 中有一个项目,当我尝试运行服务器时,上面的消息显示这是 models.py fo

    class Display(models.Model) :
     url=models.URLField(unique=True)
     text = models.CharField(max_length=150) 
    
    class  Display_Data(models.Model) :
         displays = models.ManyToManyField(Display)  
         user= models.ManyToManyField(User)
         choosenum=models.IntegerField()
         puplish_date =models.DateTimeField(default=datetime.now) 
and this the view.py

tdef submit_operation(request):
 if request.method == 'POST':
    url = request.POST.get('url')
    text = request.POST.get('title')
    choosenum = request.POST.get('CHOOSE')

    if Display.objects.filter(url=url).exists():
        display = Display.objects.get(url=url)
        display_data = Display_Data.objects.create(choosenum=choosenum, user=request.user,                  date_published=datetime.now())
        display_data.displays.add(display)
    else:
        display = Display.objects.create(url=url, text=text)
        display_data = Display_Data.objects.create(choosenum=choosenum, user=request.user,    date_published=datetime.now())
        display_data.displays.add(display)        # ... (إعادة توجيه المستخدم)

    #return redirect('searchpage') 
    return redirect(request.META.get('HTTP_REFERER'))ype herea

`当我尝试引用在 abeer 上面的消息之前保存的视频时



i make a site show video from youtube in a frame and asked a user to value the vidio i saved vidio url and when i want from user to again evluate the vidio the mistake apeer
python django django-models
1个回答
0
投票

您看到此错误的原因是 不仅

displays
而且
user
字段也具有多对多关系。

在保存 [Display_Data] 之前,您无法将 [Display_Data] 与 [用户] 关联。

参考

因此,就像关联

displays
模型实例一样,您应该在创建并保存
user
模型实例后关联
display_data
实例。

您的模型.py:

class Display(models.Model) :
     url=models.URLField(unique=True)
     text = models.CharField(max_length=150) 

class Display_Data(models.Model) :
         displays = models.ManyToManyField(Display)  
         users = models.ManyToManyField(User)
         choosenum = models.IntegerField()
         puplish_date = models.DateTimeField(default=datetime.now) 

由于 m2m 字段

displays
是复数,为了保持一致性,我也将
users
字段设为复数

您的观点.py:

def submit_operation(request):
 if request.method == 'POST':
    url = request.POST.get('url')
    text = request.POST.get('title')
    choosenum = request.POST.get('CHOOSE')

    try:
        choosenum = int(choosenum)
    except e:
       raise ValueError("couldn't convert choosenum into int")
       # or you can handle the error in a way you like

    if Display.objects.filter(url=url).exists():
        display = Display.objects.get(url=url)
        display_data = Display_Data.objects.create(choosenum=choosenum, date_published=datetime.now())
        display_data.displays.add(display)
        display_data.users.add(request.user)
    else:
        display = Display.objects.create(url=url, text=text)
        display_data = Display_Data.objects.create(choosenum=choosenum, date_published=datetime.now())
        display_data.displays.add(display)        # ... (إعادة توجيه المستخدم)
        display_data.users.add(request.user)

    #return redirect('searchpage') 
    return redirect(request.META.get('HTTP_REFERER'))ype herea

还有:

在您的 models.py 上,您已将

choosenum
定义为整数字段:

choosenum = models.IntegerField()

但是

request.POST
中的所有数据都是字符串,所以你应该将其转换为整数:

choosenum = request.POST.get('CHOOSE')

try:
    choosenum = int(choosenum)
except e:
    raise ValueError("couldn't convert choosenum into int")
    # or you can handle the error in a way you like
© www.soinside.com 2019 - 2024. All rights reserved.