Django 修改用户邮箱的方法无效
我正在尝试创建一个页面,让用户可以查看他们当前的邮箱,并在需要时进行更改。我现在只是在测试一个非常简单的表单,如果表单不合法,就会进行一个简单的HttpResponseRedirect(重定向)。但是,我发现用户的邮箱没有改变,而且如果表单不合法时,我的错误反馈也没有正常工作。我不太确定是什么原因导致的。
forms.py:
class ChangeEmail(forms.Form):
email1 = forms.EmailField(label=u'Type new Email')
email2 = forms.EmailField(label=u'Type Email again')
views.py:
def change_email(request, username):
if request.method == 'POST':
user1 = User.objects.get(username=username)
form1 = ChangeEmail(request.POST)
if form1.is_valid():
user1.email = form.cleaned_data['email1']
form1.save()
return HttpResponseRedirect('/register/success')
else:
return HttpResponseRedirect('/stupid')
else:
user = User.objects.get(username=username)
email = user.email
form = ChangeEmail()
variables = RequestContext(request, {
'form': form,
'email': email
})
return render_to_response('registration/email.html', variables
谢谢你们的帮助。
编辑:
我设置的用来显示表单的链接是 /user/testuser/email
。我尝试在输入框中输入无效内容,以便得到错误信息,但当我点击提交时,它却把我重定向回 /user/testuser
页面,这个页面显示的是用户的信息。我的更改邮箱的模板如下:
{% extends "base.html" %}
{% block title %}Change Email{% endblock %}
{% block head %}Change Email{% endblock %}
{% block content %}
<p> Current Email: {{ email }} </p>
<form method="post" action=".">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Change Email" />
</form>
{% endblock %}
2 个回答
2
views.py:
def change_email(request, username):
# a common django idiom for forms
form1 = ChangeEmail(request.POST or None)
user1 = User.objects.get(username=username)
if form1.is_valid():
#check that emails are the same
if form.cleaned_data['email1'] == form.cleaned_data['email2']:
user1.email = form.cleaned_data['email1']
#Save the user object here, since we're not dealing with a ModelForm
user1.save()
return HttpResponseRedirect('/register/success')
# We're presenting them with the empty form if something went wrong
# and redisplaying. The form's field errors should be printed out in
# the template
else:
user = User.objects.get(username=username)
email = user.email
variables = RequestContext(request, {
'form': form,
'email': email
})
return render_to_response('registration/email.html', variables)
12
ChangeEmail
是一个普通的表单。这种表单没有 save
方法,只有模型表单(ModelForms)才有。你正确地从表单的清理数据中设置了用户的邮箱,但你应该保存的是 user1
对象,而不是表单本身。
另外,在验证失败时最好不要重定向到其他页面。去掉第一个 else
语句,把变量和 render_to_response
的代码缩进回去一层,这样表单就会重新显示,并且会带上任何错误信息。