2015-09-12 159 views
0

我想在Django 1.8.3中創建一個自定義的用戶註冊表單。我想要實現的是一個基於兩個獨立模型的由兩個獨立表單組成的表單。第一個模型是默認的Django User模型,基於它的表單包含username,email,first_name,last_name,password1password2字段。第二個模型是UserDetails,現在它只包含三個字段 - user(應存儲外鍵 - 用戶標識),middle_namephone_number。我想創建一個模板,將按照以下順序顯示的這兩種形式的字段:如何從兩個Django表單創建一個字段集合?

  • 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 'RegistrationForm' object has no attribute 'username'

回答

0

你不能簡單地使用django的ModelForm來組合兩種形式。

你可以做的是擴展RegistrationForm類,通過添加來自UserDetails模型的自定義用戶字段。然後覆蓋所有需要的方法(clean,save等),以在您的流程中包含這些自定義字段。

要重新排列字段,需要在新的表單類中擴展/覆蓋Meta類。

例子:

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

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

我假設你RegistrationForm形式是基於Django的ModelForm

+0

謝謝您的回答。現在我明白我的方法是錯誤的(因爲我想堅持一對一的模型形式依賴性,儘管這不是必須的)。擴展我的表單類當然是一個更好的主意。 – Mefael

相關問題