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

相关问题