我创建了一个更新配置文件页面。因此字段为:电子邮件、名字、姓氏。
在验证过程中,我试图排除已登录用户的电子邮件地址,同时过滤其他用户的电子邮件。我想如果你看到代码,你就会明白我在说什么。
我在这里读了几个问题,但找不到什么。一些用户也有同样的问题。
因此,使用下面的代码,我得到的问题是:类型对象"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
我假设current_user_email = User.email
行中的"User"实际上不是一个实际的用户实例,它是您为在Meta中设置model = User
而导入的模型类。如果你只想使用这个表单来编辑用户数据,你应该这样做:
urls.pyurl模式=模式('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
。