代码之家  ›  专栏  ›  技术社区  ›  Animesh

更新自定义用户配置文件

  •  0
  • Animesh  · 技术社区  · 9 年前

    在我的web应用程序中,我需要两个用户,普通网站用户和员工。我正在使用基于的自定义用户 AbstractUser 为了实现这一点。

    class CustomUser(AbstractUser):
        pass
    
    class Employee(CustomUser):
        user = models.OneToOneField(settings.AUTH_USER_MODEL)
        # other fields
    

    在设置中。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>
    

    在编辑用户配置文件页面中,我看到电子邮件正确地填充到电子邮件字段中。单击“提交”时,我会收到一条验证错误消息:

    此电子邮件地址已在使用中。请提供其他电子邮件地址。

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

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   Satendra    9 年前

    去除 .exclude(username=username) 从中的查询 if clean_电子邮件方法中的子句。

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

    同时添加 self.instance.email != email

    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()
    
    推荐文章