Django 更新自定义用户配置文件

Django 更新自定义用户配置文件,django,user-profile,django-custom-user,Django,User Profile,Django Custom User,在我的web应用程序中,我需要两个用户,普通网站用户和员工。我正在使用一个基于AbstractUser的自定义用户来实现这一点 class CustomUser(AbstractUser): pass class Employee(CustomUser): user = models.OneToOneField(settings.AUTH_USER_MODEL) # other fields 在settings.py中,我有: AUTH_USER_MODEL = 'a

在我的web应用程序中,我需要两个用户,普通网站用户和员工。我正在使用一个基于
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>

{%csrf_令牌%}
{{form.as_p}}
更新信息
在编辑用户配置文件页面中,我看到电子邮件正确地填充到电子邮件字段中。单击“提交”时,我会收到一条验证错误消息:

此电子邮件地址已在使用中。请提供不同的电子邮件地址

这就好像更新表单正在尝试创建新用户一样。我该怎么做才能解决这个问题

附加问题:相同的解决方案是否适用于员工用户的用户配置文件页面?

删除
。从clean\u email方法内的
if
子句中的查询中排除(用户名=用户名)

由于表单类UserProfileEditForm中没有用户名字段,因此从cleandata中获取用户名是无用的,它将始终为空

同时添加
self.instance.email!=向if子句发送电子邮件,以便当前用户能够更新其个人资料信息

if email and self.instance.email != email and get_user_model().objects.filter(email=email).count():
更新2

注销问题是由于
user\u profile\u 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()

结果仍然与您提到的更新的queryset相同。提交时出现验证错误。请检查“我的更新”部分,然后尝试在该部分再添加一个检查。抱歉,添加子句不起作用,我只是在提交数据时注销。奇怪的是,您在提交时注销。更新
get\u user\u model()
code to question,让我试试我的本地环境。我意识到我不需要它,于是将其删除。谢谢你的帮助。