1

我發現此 post關於如何使用諸如「email」等額外字段擴展UserCreationForm。但是,電子郵件字段已在預建的用戶模型中定義。如何使用UserProfile中的字段擴展UserCreationForm

我創建了一個額外的模型(稱爲UserProfile),它進一步擴展了Django的預構建User類。如何讓我在UserProfile中定義的這些字段出現在我的UserCreationForm中?

回答

8

添加字段以適合您的UserProfile模型(這不是太容易使用ModelForm避免重複自己,遺憾的是),然後創建並保存新UserProfile例如在過纏身save()功能。改編自您鏈接到的帖子:

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 


class UserCreateForm(UserCreationForm): 
    job_title = forms.CharField(max_length=100, required=True) 
    age = forms.IntegerField(required=True) 

    class Meta: 
     model = User 

    def save(self, commit=True): 
     if not commit: 
      raise NotImplementedError("Can't create User and UserProfile without database save") 
     user = super(UserCreateForm, self).save(commit=True) 
     user_profile = UserProfile(user=user, job_title=self.cleaned_data['job_title'], 
      age=self.cleaned_data['age']) 
     user_profile.save() 
     return user, user_profile 
+0

謝謝!只是爲了澄清我自己,job_title和age是在UserProfile中定義的字段的權利?我們知道UserProfile通過外鍵連接到用戶。這是否意味着如果我爲像User這樣的模型創建一個Model Form,那麼來自任何User的外鍵的字段也可以在Form中使用? – goelv 2012-08-11 23:27:36

+1

'job_title'和'age'是,你的'UserProfile'模型中的假想字段。關鍵是您可以將任何您喜歡的字段添加到「ModelForm」;與「Meta」中指定的模型無關的部分將被忽略,並由您來處理。這就是我所建議的代碼所做的事情(從'self.cleaned_data'中提取值。 – supervacuo 2012-08-11 23:29:53

+1

* ie *即使這些字段不是'UserProfile'上的模型字段,它們仍然可以工作,您只是無法做到在'save()'中有任何有意義的東西,'UserProfile'沒有什麼特別之處 – supervacuo 2012-08-11 23:31:12

相關問題