2011-12-23 27 views
3

我正在尝试创建一个页面,用户可以看到他们当前的电子邮件是什么,如果他们想要改变它。我只是测试一个非常简单的表单和一个非常简单的HttpResponseRedirect,如果表单无效。然而,无论我的电子邮件是否为用户更改,也不是我的失败响应,如果表单无效工作。我不知道是什么原因造成这种Django的方法来改变用户电子邮件不工作

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的URL。我试图将无效输入放入字段以获取错误消息,但是当我推送时,将其重定向回/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 %} 

回答

12

ChangeEmail是一种正常形式。这些没有save方法 - 仅限于ModelForms。您正确设置了表单的cleared_data中的用户电子邮件 - 但您应该保存user1对象,而不是表单。

另外,最好不要在验证失败时重定向。在第一个else子句中省略掉,并将变量/ render_to_response行移回一个缩进级别,并且该表单将随任何错误重新显示。

+0

我已经把它改为'user1.save()'和您所做的reccommended的其他变化。然而,当我输入无效的输入时,它只是将我重定向到前一个网页,我是一个不显示错误消息的网页。 – 2011-12-23 18:06:57

+0

你如何在模板中渲染表单?你是否在使用'{{form.as_p}}',用'{{form.email1}}'分别渲染字段,或者是什么? – 2011-12-23 18:09:03

+0

我正在使用'{{form.as_p}}' – 2011-12-23 18:12:55

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) 
+0

+1。关键是要使用request.POST实例化表单,然后在模板中使用该表单实例(如果表单无效)。这会向用户显示错误。 – 2011-12-23 23:29:27

+0

这样做是否会将验证邮件发送给用户,例如使用Django All Auth? – Flimm 2016-05-11 16:44:08