Метод Django для изменения электронной почты пользователя не работает - PullRequest
3 голосов
/ 23 декабря 2011

Я пытаюсь создать страницу, на которой пользователь может видеть свой текущий адрес электронной почты и изменить его, если он этого захочет. Я просто тестирую с очень простой формой и очень простым 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

Заранее спасибо за помощь.

EDIT:

URL, который я назначил для отображения формы, - /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 ]

12 голосов
/ 23 декабря 2011

ChangeEmail нормальная форма.У них нет save методов - только у ModelForms.Вы правильно настраиваете электронную почту пользователя из формы cleaned_data - но вы должны сохранять объект user1, а не форму.

Кроме того, лучше не перенаправлять при ошибке проверки.Оставьте это первое предложение else и переместите строки variable / render_to_response обратно на один уровень отступа, и форма будет снова отображена с любыми ошибками.

2 голосов
/ 23 декабря 2011

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...