如何在 django 注册表单中添加额外的字段?

Posted

技术标签:

【中文标题】如何在 django 注册表单中添加额外的字段?【英文标题】:How to add extra fields to django registration form? 【发布时间】:2018-01-24 06:36:55 【问题描述】:

我有一个在视图中生成的注册表单。现在我需要从其他模型中添加一些字段。我应该如何更改视图以添加来自另一个模型的字段?

这是我的查看代码:

def register(request):
    """ User registration """
    if auth.get_user(request).username:
        return redirect('/')

    context = 
    context.update(csrf(request))
    context['form'] = UserCreationForm()
    if request.POST:
        newuser_form = UserCreationForm(request.POST)
        if newuser_form.is_valid():
            newuser_form.save()
            newuser = auth.authenticate(username=newuser_form.cleaned_data['username'],
                                    password=newuser_form.cleaned_data['password2'])
        auth.login(request, newuser)
        return redirect('/')
        else:
            context['form'] = newuser_form

    return render(request, 'user_auth/user_auth_register.html', context)

【问题讨论】:

尝试子类化UserCreationForm 可能对某人有帮助simpleisbetterthancomplex.com/tutorial/2017/02/18/… 类似问题link 【参考方案1】:

这样的事情应该可以帮助你:

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

class UserCreateForm(UserCreationForm):
    extra_field = forms.CharField(required=True)

    class Meta:
        model = User
        fields = ("username", "extra_field", "password1", "password2")

    def save(self, commit=True):
        user = super(UserCreateForm, self).save(commit=False)
        user.extra_field = self.cleaned_data["extra_field"]
        if commit:
            user.save()
        return user

基本上,扩展UserCreationForm 并添加一个额外的字段。另外,将其保存在save() 方法中。

希望对你有帮助。

【讨论】:

也许这是个愚蠢的问题,我是 python 和 django 的新手,但是如果我需要将自定义额外字段中的数据保存到我自己的模型(例如“UserInfo”)中,它会起作用吗?对我来说还不清楚谢谢! @RomanKozinets 如果您需要自定义行为,您应该自定义 save() 模型。你可以用你的extra_field 做任何你想做的事情。 用户表的后端模型怎么样?我们是否需要更新 auth_user 表以包含新字段?【参考方案2】:

默认情况下,UserCreationForm 带有用户名、密码、名字、姓氏、电子邮件。

我想添加额外的信息字段(事后使用 ProfileUpdateForm 很容易完成),但我希望将其包含在初始注册表单中,这样用户只需提交一次。

解决方案是使用两种形式并将它们组合起来。魔术技巧是启动手动数据库刷新以访问新创建的配置文件

参考:https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html

views.py

def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    p_reg_form = ProfileRegisterForm(request.POST)
    if form.is_valid() and p_reg_form.is_valid():
        user = form.save()
        user.refresh_from_db()  # load the profile instance created by the signal
        p_reg_form = ProfileRegisterForm(request.POST, instance=user.profile)
        p_reg_form.full_clean()
        p_reg_form.save()
        messages.success(request, f'Your account has been sent for approval!')
        return redirect('login')
else:
    form = UserRegisterForm()
    p_reg_form = ProfileRegisterForm()
context = 
    'form': form,
    'p_reg_form': p_reg_form

return render(request, 'users/register.html', context)

forms.py

class UserRegisterForm(UserCreationForm):
email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class ProfileRegisterForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['city', 'state', 'country', 'referral']

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    confirmed = models.BooleanField("Confirmed", default=False)

    city = models.CharField("City", max_length=50, blank=True)
    state = models.CharField("State", max_length=50, blank=True)
    country = models.CharField("Country", max_length=50, blank=True)
    referral = models.CharField("Referral", max_length=50, blank=True)

def __str__(self):
    return f'self.user.username Profile'

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)

【讨论】:

很好的答案我为此搜索了一段时间。非常感谢

以上是关于如何在 django 注册表单中添加额外的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Python/Django django-registration 添加一个额外的字段

如何在 django 模型表单中添加自定义字段?

如何在 Django 中向 ModelForm 添加非模型字段?

Django 中的动态模型字段

表单 ModelChoiceField 查询集 + 额外选择字段 django 表单

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段