如何在 Django 注册表中添加额外的字段?
How to add extra fields to django registration form?
我有一个在视图中生成的注册表。现在我需要从其他模型中添加一些字段。我应该如何更改视图以添加来自另一个模型的字段?
这是我的查看代码:
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)
类似这样的内容应该对您有所帮助:
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()
方法中。
希望对您有所帮助。
默认情况下,UserCreationForm 附带用户名、密码、first_name、last_name、电子邮件。
我想添加额外的信息字段(事后使用 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)
我有一个在视图中生成的注册表。现在我需要从其他模型中添加一些字段。我应该如何更改视图以添加来自另一个模型的字段?
这是我的查看代码:
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)
类似这样的内容应该对您有所帮助:
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()
方法中。
希望对您有所帮助。
默认情况下,UserCreationForm 附带用户名、密码、first_name、last_name、电子邮件。
我想添加额外的信息字段(事后使用 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)