多对多 - 正确使用

时间:2015-06-19 12:09:29

标签: django

我有这样的模特:

User:
    #somefields
    apps = models.ManyToManyField(App)

此处,用户最初是在注册期间创建的。他在单独的页面中使用多个应用程序链接应用程序,用户只选择(多个)应用程序,而不选择任何其他字段。

在Django中填充应用程序的最佳方法是什么?

例如,如果我们也可以创建User,我们可以简单地使用modelform,其中.save(commit = False)将创建用户,而.save_m2m()将链接应用程序。但在这里我们不需要创建用户。我们已经有了用户,我们只需要添加应用。怎么样 ?

新增详情: 我知道如何处理正常"形式"和正常的网络方式。但我想写出高质量的代码,所以想知道。如果使用普通形式没有任何问题,那就好了。

3 个答案:

答案 0 :(得分:0)

也许我没有完全理解这个问题(请澄清是否不是这样),但在同一型号上有两种形式没有问题:

  • 创建用户的一种表单,无需选择应用程序(将为空)
  • 向用户添加应用的一种表单,考虑到它已经存在(并且此时尚未创建)。

它回答了这个问题吗?

答案 1 :(得分:0)

您可以使用ModelFormmodel = App字段创建User表单。现在,在创建表单时,设置User的初始值:

form = AppForm(initial={'user': 1})

答案 2 :(得分:0)

有多种方法可以做到这一点,例如:

class UserAppForm(ModelForm):
  class Meta:
      model = User
      fields = ['apps']

在您看来,您可以配置路由,以便:

  • 获取要选择的用户的ID
  • 如果找不到ID(而不是创建新ID),则提出错误
  • 使用用户
  • 初始化表单

例如:

def user_add_app(request, pk):
  user = get_object_or_404(User, pk=pk)

  if request.method == "POST":
    form = UserAppForm(request.POST, instance=user)

    if form.is_valid():
      user = form.save()
      return HttpResponseRedirect(<some redirect>)

  else:
    form = EmployeeForm(instance=user)

  return render(request, "<some html file>", {'form': form})