在我的网络应用中,我需要两个用户,常规网站用户和员工。我正在使用基于AbstractUser
的自定义用户来实现此目的。
class CustomUser(AbstractUser):
pass
class Employee(CustomUser):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# other fields
在settings.py中我有:
AUTH_USER_MODEL = 'app.CustomUser'
我想为常规网站用户和员工用户提供个人资料页面。
首先,我为常规网站用户创建了一个名为UserProfileEditForm
的表单:
class UserProfileEditForm(forms.ModelForm):
email = forms.EmailField(required=True)
first_name = forms.CharField(required=False)
last_name = forms.CharField(required=False)
class Meta:
model = get_user_model()
fields = ('email', 'first_name', 'last_name')
def clean_email(self):
username = self.cleaned_data.get('username')
email = self.cleaned_data.get('email')
if email and get_user_model().objects.filter(email=email).exclude(username=username).count():
raise forms.ValidationError('This email address is already in use. Please supply a different email address.')
return email
def save(self, commit=True):
user = super(UserProfileEditForm, self).save(commit=False)
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
相应的观点:
@login_required
def user_profile_edit(request):
user = get_user_model()
if request.method == 'POST':
form = UserProfileEditForm(request.POST, instance=request.user)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
return redirect('user_profile')
else:
form = UserProfileEditForm(instance=request.user)
return render(request, 'user/user_profile_edit.html', {
'form': form
})
和表格:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Update Information</button>
</form>
在修改用户个人资料页面中,我看到电子邮件正确填充到电子邮件字段中。当我单击提交时,我收到验证错误消息:
此电子邮件地址已被使用。请提供不同的电子邮件地址。
就好像更新表单正在尝试创建新用户一样。我该怎么做才能解决这个问题?
奖金问题:相同的解决方案是否适用于Employee用户的用户个人资料页面?
答案 0 :(得分:1)
从clean_email方法中的.exclude(username=username)
子句中的查询中删除if
。
由于表单类UserProfileEditForm中没有用户名字段,因此从cleandata中获取用户名是无用的,它将始终为None
同时将self.instance.email != email
添加到if子句,因此当前用户将能够更新其个人资料信息。
if email and self.instance.email != email and get_user_model().objects.filter(email=email).count():
更新2
已注销的问题是由于user_profile_edit
方法
if form.is_valid():
user = form.save(commit=False)
# below line of code deactivating user and hence user got logged out, remove these lines
user.is_active = False
user.save()
使用
更改上面的代码行# You have already mentioned a save method inside UserProfileEditForm class
if form.is_valid():
form.save()