Django,更新个人资料,排除当前用户邮件

0 投票
1 回答
717 浏览
提问于 2025-04-18 04:18

我创建了一个更新个人资料的页面。这个页面上有几个输入框:电子邮件、名字和姓氏。

在验证这些输入时,我想排除当前登录用户的电子邮件地址,同时也想过滤掉其他用户的电子邮件地址。我觉得如果你看看下面的代码,你就会明白我在说什么。

我在这里看了好几个问题,但没有找到合适的答案。有些用户也遇到了同样的问题。

根据下面的代码,我遇到的问题是:类型对象 'User' 没有属性 'email'

我尝试了很多方法来获取当前用户的电子邮件地址(在我保存表单之前),但还是没有成功。

forms.py

class UpdateProfile(forms.ModelForm):
    email = forms.EmailField(required=True)
    first_name = forms.CharField(required=False)
    last_name = forms.CharField(required=False)

    class Meta:
        model = User
        fields = ('email', 'first_name', 'last_name')

    def clean_email(self):
        email = self.cleaned_data.get('email')
        current_user_email = User.email
        if User.objects.filter(email__iexact=email).exclude(email__iexact=current_user_email).count() > 0:
            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(UpdateProfile, self).save(commit=False)

        if commit:
            user.save()

        return user

1 个回答

0

我想在这一行 current_user_email = User.email 中,“User”其实并不是一个真实的用户实例,而是你导入的一个模型类,用来在Meta中设置 model = User

如果你只想用这个表单来编辑用户数据,你应该这样做:

urls.py

urlpatterns = patterns('project.apps.app_name.views',

    url(r'^edit-user/(?P<pk>\d+)/?$','edit_user',name='edit_user'),
)

app_name/views.py:

def edit_user(request,pk):
    user_instance =  User.objects.get(pk=pk)
    form = UpdateProfile(request.POST, instance=user_instance)
    .... more code ....

在forms.py中,你应该把这一行改成:

current_user_email = User.email

改成:

current_user_email = self.instance.email

不过,如果你使用的是django版本大于1.6,正确的做法是创建一个自定义的用户模型,并把邮箱字段的属性设置为 unique=True

撰写回答