【问题标题】:Django Forms, having multiple "Models" in Meta class?Django Forms,在 Meta 类中有多个“模型”?
【发布时间】:2012-06-21 12:47:08
【问题描述】:

我们可以在表单的“元类”部分定义多个模型吗?

这是我的例子:

from django import forms

from django.contrib.auth.models import User , Group

from django.forms import ModelForm

from django.utils.translation import ugettext as _

from profiles.models import Student , Tutor 


class RegistrationForm(ModelForm):
    email           = forms.EmailField(label=_('Email Address:'))
    password        = form.CharField(label=_('Passsword:') , widget = forms.PasswordInput(render_value = False))
    password1       = form.CharField(label=_('Verify Passsword:') , widget = forms.PasswordInput(render_value = False))

    class Meta:
        model = [Student , Tutor] ## IS THIS TRUE ???

【问题讨论】:

  • 我从未见过。我认为您应该使用多个 ModelFom 或单个 Form 并使用其数据来创建每个模型的实例,然后为每个模型创建 Model.save()。
  • @Secator :你是什么意思?我想从头开始写一个注册表。我在系统中至少有两个演员:学生和导师......
  • @Machaku:你的意思是像“漫游”的答案吗?
  • 这不是一个坏问题,这是一个正常的问题。我认为这一定是一个好方法。

标签: django django-forms django-admin django-registration


【解决方案1】:

没有。但你不需要。不要实例化和验证一个单个表单,而是为您需要支持的每种类型的表单执行此操作。

# Define your model forms like you normally would
class StudentForm(ModelForm):
    ...

class TutorForm(ModelForm):
    ...

class RegistrationForm(Form):
    email = ...
    ...

# Your (simplified) view:
...
context = {
    'student_form': StudentForm(),
    'tutor_form': TutorForm(),
    'registration_form': RegistrationForm()
}
return render(request, 'app/registration.html', context)

# Your template
...
<form action="." method="post">
    {{ student_form }}
    {{ tutor_form }}
    {{ registration_form }}
    <input type="submit" value="Register">
</form>

如果这意味着字段名称在表单中重复,请使用form prefixes 进行排序。

【讨论】:

  • 非常感谢您的完整回答...我必须思考并完全理解它,但是您的示例提出的要点是很好的提示..
【解决方案2】:

不,不能在 Meta 类中定义多个模型。

您可以为每个模型创建一个模型表单,然后使用prefix 参数将多个表单放在同一个html &lt;form&gt; 标记中。

然后在你的视图中,你可以在保存之前检查每个模型表单是否有效。

请注意,django contrib.auth 应用程序带有 UserCreationForm (view source)。您可能可以重复使用它而不是编写自己的表单。

【讨论】:

  • 我看到了UserCreationForm的来源。我想我必须自定义它,因为我通过电子邮件对用户进行身份验证。但是如何根据我拥有的这两个演员(学生和导师)来调整它们?我有点困惑..
  • 子类化 UserCreationForm 以自定义行为可能比从头开始编写自己的表单更好。您不需要为 StudentTutor 模型调整表单 - 只需在您的视图中定义一个单独的 StudentForm 并将其放在同一个 html 标记中,正如我和 @roam 的答案所建议的那样。跨度>
【解决方案3】:

在你的 form.py 中定义你的模型

form1 #使用第一个模型

form2#使用第二个模型

现在在 get 方法中编辑您的 views.py

args = {

"form1" = form1(),

"form2" = form2()

}

return render(request, "template_name", args)

现在编辑您的模板

&lt;form .....&gt;

form1.as_p

form2.as_p

...

&lt;/form&gt;

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2020-12-10
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多