【问题标题】:Django 2 models 1 formDjango 2 模型 1 形式
【发布时间】:2012-07-15 19:29:25
【问题描述】:

所以,我仍然是 Django 的菜鸟,我想知道如何执行以下操作:

所以可以说我有类似下面的代码:

class UserProfile(models.Model):
    #Some fields
class UserProfileOther(models.Model):
    #Some other fields that I want in another table for organization
    user_profile = models.OneToOneField(UserProfile)

我现在如何创建包含上述两种模型的表单?

【问题讨论】:

  • 根据我的经验,您将创建第 3 个 FormClass,即表单(不是模型!),然后使用它的 save 正确写回数据。它让您在显示表单时更加灵活。
  • 您是否有理由希望两个模型具有相同的形式?您只是想制作一个 HTML 表单(因此用户只需提交一次)?

标签: django django-models django-forms


【解决方案1】:

您可以创建两个单独的 ModelForm 类。但在您看来,您必须为它们的实例添加前缀。

def viewname(request):
    if request.method == 'POST':
        form1 = forms.YourForm(request.POST, prefix="form1")
        form2 = forms.YourOtherForm(request.POST, prefix="form2")
        if form1.is_valid() and form2.is_valid():
            # process valid forms
    else:
        form1 = forms.YourForm(prefix="form1")
        form2 = forms.YourOtherForm(prefix="form2")

    ....

使用前缀可确保名称相似的字段不会混淆。

【讨论】:

  • 这样,如果 form1 无效,它将不会继续验证 form2 并且不会显示它的错误。
  • 在这种情况下,您可以执行 form1_valid=form1.is_valid() + form2_valid=form2.is_valid() 然后 if form1_valid 和 form2_valid: ...
  • 有人知道如何使用基于类的视图来做到这一点吗?
  • @umami,目前没有为此场景制作的基于类的通用视图。但我听说它会在某个时候到来。在那之前,通过实现你自己的 post() 等来解决这个问题并不是一个真正的难题。
【解决方案2】:

inline formsets 就是为此类问题设计的。

【讨论】:

    【解决方案3】:

    我这样做的方式是基于第一个模型创建一个表单,然后基于继承第一个表单的第二个模型创建一个表单。含义:

    类 UserProfileForm(ModelForm): ...

    类 UserProfileOtherForm(UserProfileForm): ...

    并将UserProfileOtherForm 传递给表单模板。它对我有用。不确定是否有更简单的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多