【问题标题】:Direct assignment to the forward side of a many-to-many set is prohibited. Use Class.set() instead禁止直接分配到多对多集合的前端。改用 Class.set()
【发布时间】:2021-05-22 16:52:50
【问题描述】:

当我尝试保存多对多关系中的类时,django 会抛出以下错误

TypeError at /class-create/
Direct assignment to the forward side of a many-to-many set is prohibited. Use Class.set() instead.

我的views.py看起来像这样

@login_required()
def create_class(request):
  tea_user = request.user.username
  validate = teacher_validation(tea_user)
  if validate:
        if request.method == 'POST':
        Link = request.POST.get('link')
        Subject = request.POST.get('Subject')
        Class = request.POST.get('Class')
        teacher_user = Teacher.objects.get(User=request.user)
        teacher = Teacher.objects.get(id=teacher_user.id)
        created_class = Online_Class(Link=Link, Subject=Subject, Created_by =teacher, Class=Class)
        created_class.save()

    return render(request, 'online_class/Teacher/class-create.html')
  else:
       messages.warning(request, 'Sorry You Dont have Permission to access this page')
       return redirect('logout')

我的 models.py 文件看起来像这样

class Online_Class(models.Model):
   Created_by = models.ForeignKey(Teacher, on_delete=models.DO_NOTHING)
   Class = models.ManyToManyField(Classes)
   Subject = models.CharField(max_length=100)
   Link = models.CharField(max_length=200)
   Joined_by = models.ManyToManyField(Student, blank=True)
   created_at = models.DateTimeField(auto_now_add=True)
   choice = (('Yes','Yes'),('No', 'No'))
   Class_Ended = models.CharField(choices=choice, default='No', max_length=10)

请帮我解决

【问题讨论】:

    标签: python django


    【解决方案1】:

    你不能设置class=Class在:

    created_class = Online_Class(Link=Link, Subject=Subject, Created_by =teacher<s><b>, Class=Class</b></s>)

    因为ClassManyToManyField,所以不能这样设置,你先创建OnelineClass,然后用created_class.Class.set(&amp;hellip)添加一个(或多个)条目:

    @login_required
    def create_class(request):
      tea_user = request.user.username
      validate = teacher_validation(tea_user)
      if validate:
            if request.method == 'POST':
            Link = request.POST.get('link')
            Subject = request.POST.get('Subject')
            Class = request.POST.get('Class')
            teacher_user = Teacher.objects.get(User=request.user)
            teacher = Teacher.objects.get(id=teacher_user.id)
            created_class = Online_Class.objects.create(
                Link=Link,
                Subject=Subject,
                Created_by =teacher
            )
            created_class.Class.set([Class])
    
        return render(request, 'online_class/Teacher/class-create.html')
      else:
           messages.warning(request, 'Sorry You Dont have Permission to access this page')
           return redirect('logout')

    注意:通常是 Django 模型,就像 Python 中的所有类都以 PascalCase 命名,而不是 snake_case,所以它应该是:OnlineClass 而不是 Online_Class


    注意:通常Django模型中的字段名是用snake_case写的,而不是PascalCase,所以应该是:@ 987654332@ 而不是 Class


    注意:如果 POST 请求成功,您应该发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2018-10-05
      • 2020-03-21
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多