当前位置: 首页 > 面试题库 >

Django M2M表单保存“通过”表

经福
2023-03-14
问题内容

我在保存包含“直通”类表的m2m数据时遇到了麻烦。我想将所有选定的成员(在表单中选择)保存在通过表中。但是我不知道如何在视图中初始化“通过”表。

我的代码:

class Classroom(models.Model):
     user = models.ForeignKey(User, related_name = 'classroom_creator')
     classname = models.CharField(max_length=140, unique = True)
     date = models.DateTimeField(auto_now=True)
     open_class = models.BooleanField(default=True)
     members = models.ManyToManyField(User,related_name="list of invited members", through = 'Membership')

class Membership(models.Model): 
      accept = models.BooleanField(User)
      date = models.DateTimeField(auto_now = True) 
      classroom = models.ForeignKey(Classroom, related_name = 'classroom_membership')
      member = models.ForeignKey(User, related_name = 'user_membership')

并在视图中:

def save_classroom(request):
   classroom_instance = Classroom()
   if request.method == 'POST':
        form = ClassroomForm(request.POST, request.FILES, user = request.user) 
        if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.user = request.user 
           new_obj.save()
           membership = Membership(member = HERE SELECTED ITEMS FROM FORM,classroom=new_obj)

           membership.save() 

我应该如何初始化要正确填充的Membership表的成员资格?


问题答案:

如果使用正常的m2m关系(不通过中间表),则可以替换:

membership = Membership(member = HERE SELECTED ITEMS FROM FORM,classroom=new_obj)
membership.save()

form.save_m2m()

但是,在使用中间表的情况下,你需要手动处理POST数据并创建具有所有必填字段的Membership对象(类似问题)。最基本的解决方案是将视图更改为:

def save_classroom(request):
    if request.method == 'POST':
        form = ClassroomForm(request.POST, request.FILES)

        if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.user = request.user 
           new_obj.save()

           for member_id in request.POST.getlist('members'):
                membership = Membership.objects.create(member_id = int(member_id), classroom = new_obj)
           return HttpResponseRedirect('/')
    else:
        form = ClassroomForm()
    return render_to_response('save_classroom.html', locals())

请注意如何操作request.POST(.getlist)。这是因为post和get是具有某些含义的QueryDict对象(request.POST [‘members’]将始终返回一个对象!)。

你可以修改此代码以使其更可靠(错误处理等),并且更详细,例如:

member = get_object_or_404(User, pk = member_id)
membership = Membership.objects.create(member = member , classroom = new_obj)

但是请注意,你正在循环中执行一些数据库查询,这通常不是一个好主意(就性能而言)。



 类似资料:
  • 问题内容: 我在从表单保存许多字段时遇到问题。这是我的模型: 在这里,我在中处理发布请求: 每当我通过表单保存时,只有Notes文本字段都会保存在PHIssue实例中,并且许多字段都是空白。有人可以帮我找出问题所在吗? 问题答案: 使用时,你必须致电 关系要求先保存父对象,而你并没有使用

  • 问题内容: 我有一个表单,我想通过ajax jQuery post保存数据。如果保存按钮为,则不会执行任何仅空警报的操作…我想保存数据并保持刷新形式的相同形式… 这是我尝试过的: 这是我的表格 问题答案: 这样做 的HTML 你的jQuery 所以在页面 希望这能给一个想法

  • 问题内容: 我正在尝试存储一个Integer并使用KeyChain对其进行检索。 这是我如何保存它: 这是我尝试检索它的方式: 我收到以下错误: 无法将类型’__NSCFNumber’的值强制转换为’NSString’ 我尝试使用变量,但没有成功。 问题答案: 好吧,我只是用光了源代码等,并做了自己的好帮手:尽情享受吧!

  • 我有个问题,希望你能帮助我。我的控制器中有一个创建CodeIgniter会话的方法。为确保创建正确,我在创建会话后执行函数。然后,在我的Ajax请求中,我放置了一个以刷新页面。 这就是我的方法: 这种方法称为槽式Ajax,如; 最后,在Ajax请求中,我做了,但是当页面刷新时,这将把我重定向到,并且当我想检查包含

  • 我正在制作一个表单,其中使用jQuery进行客户端验证,然后在提交后使用PHP进行服务器端验证。我的问题是,通过使用$(“Form”).Submit(函数(e){},当我单击Cancel和Delete按钮时,验证消息也会出现,而这是不应该的。我只希望只有当单击Save按钮时才会发生验证。有没有其他方法可以做到这一点?非常感谢。下面是我的代码:

  • 问题内容: 我正在尝试通过Django Shell保存图像文件。 我的是: 一切都可以用admin和form进行,但是我想使用shell保存图像: 就像是 问题答案: 您最终将图像复制到中指定的目录中。 在这种情况下,该方法还将保存实例。可以在以下位置找到用于保存的文档:https://docs.djangoproject.com/en/dev/ref/files/file/