如何从两个Django表单创建字段集合?

时间:2015-09-12 18:45:57

标签: python django forms

我正在尝试在Django 1.8.3中创建自定义用户注册表单。我想要实现的是一个表单,它由两个独立的表单组成,基于两个独立的模型。第一个模型是默认的Django User模型,基于它的表单包含usernameemailfirst_namelast_namepassword1password2个字段。第二个模型是UserDetails,现在它只包含三个字段 - user(应存储外键 - 用户ID),middle_namephone_number。我想创建一个模板,按以下顺序显示这两个表单的字段:

  • username
  • email
  • phone_number
  • first_name
  • middle_name
  • last_name
  • password1
  • password2

问题是:有没有办法创建这些字段的列表(或任何其他集合),我可以稍后迭代这些字段以按特定顺序显示它们?我试图创建表单的实例:

registration_form = RegistrationForm()
user_details_form = UserDetailsForm()

以及我的自定义订单中的字段列表:

fields = [registration_form.username, 
          registration_form.email, 
          user_details_form.phone_number,
          registration_form.first_name,
          ...]

然后我尝试使用以下代码在HTML文件中显示字段:

{% for field in fields %}
    {{ field }}
    {{ field.help_text }}
    {{ field.errors }}
{% endfor %}

但它不起作用 - 我收到以下错误:

  

AttributeError at / register'RegisterForm'对象没有属性   '用户名'

1 个答案:

答案 0 :(得分:0)

您不能简单地使用django' s ModelForm合并两个表单。

您可以通过添加RegistrationForm模型中的自定义用户字段来扩展UserDetails类。然后覆盖所有需要的方法(cleansave等),以在流程中包含这些自定义字段。

要重新排序字段,您需要在新表单类中扩展/覆盖Meta类。

示例:

class UserDetailsForm(RegistrationForm):
    middle_name = ...
    phone_number = ...

    class Meta:
        model = User
        fields = ('username', ..., 'password2')

我假设您的RegistrationForm表单基于django' s ModelForm