【问题标题】:How to extend UserCreationForm with fields from UserProfile如何使用来自 UserProfile 的字段扩展 UserCreationForm
【发布时间】:2012-08-08 17:46:58
【问题描述】:

我发现这个 post 是关于如何使用“电子邮件”等额外字段扩展 UserCreationForm。但是,email 字段已经在预构建的用户模型中定义。

我创建了一个额外的模型(称为 UserProfile),它进一步扩展了 Django 的预构建用户类。如何让我在 UserProfile 中定义的这些字段出现在我的 UserCreationForm 中?

【问题讨论】:

    标签: django django-models django-forms django-views django-users


    【解决方案1】:

    为您的UserProfile 模型添加适当的字段(不幸的是,使用ModelForm 来避免重复自己不太容易),然后在覆盖的save() 中创建并保存一个新的UserProfile 实例功能。改编自您链接到的帖子:

    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
    

    【讨论】:

    • 谢谢!只是为了澄清一下,job_title 和 age 是在 UserProfile 中定义的字段吗?我们知道 UserProfile 通过外键连接到 User。这是否意味着如果我为像用户这样的模型创建模型表单,那么用户的任何外键中的字段也可以在表单中使用?
    • job_titleage 是,是的,你的 UserProfile 模型上的假想场。关键是您可以将任何您喜欢的字段添加到ModelForm;与Meta 中指定的模型无关的将被忽略,由您来处理它们。这就是我建议的代码正在做的事情(从self.cleaned_data 中提取值。
    • ie 添加字段仍然有效,即使 UserProfile 上的不是模型字段,您只是无法在 @ 中对它们做任何有意义的事情987654335@。 UserProfile 这里没有什么特别之处。
    • 哦,我明白了!最后一个问题:如何调用表单的保存方法/它有什么作用?我的意思是,当我在 views.py 中处理表单时,如何访问用户刚刚输入数据的字段?
    • 您只需要form = UserCreateForm(request.POST) 后跟if form.is_valid(): user, user_profile = form.save() 之类的内容。有关更多信息,请参阅“Working with forms”和“Creating forms from models”文档。
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2015-12-27
    • 2018-03-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多