Django 修改用户邮箱的方法无效

3 投票
2 回答
2718 浏览
提问于 2025-04-17 08:55

我正在尝试创建一个页面,让用户可以查看他们当前的邮箱,并在需要时进行更改。我现在只是在测试一个非常简单的表单,如果表单不合法,就会进行一个简单的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 的代码缩进回去一层,这样表单就会重新显示,并且会带上任何错误信息。

撰写回答