我无法使用Django

时间:2018-10-29 22:04:44

标签: django django-forms

我使用内置的PasswordChangeForm类,但是我重写了模板的html,因为我不喜欢错误消息的默认位置(奇怪地位于“新密码”字段和“新密码确认”字段之间)。

当我正确填写新旧密码时,我的表单可以使用。否则,页面将重新加载而没有指示。

当它起作用时,我将重定向到“ PasswordChangeDoneView”页面。 理想情况下,我希望不要被重定向,但这并不重要。

url.py:

path('password_change/', auth_views.PasswordChangeView.as_view(), name = 'password_change'),
path('password_change_done/', auth_views.PasswordChangeDoneView.as_view(), name = 'password_change_done'),

views.py:

@login_required
def password_change(request):
    if request.method == 'POST':
        password_form = PasswordChangeForm(instance = request.user, data = request.POST)
        if password_form.is_valid():
            password_form.save()
            update_session_auth_hash(request, password_form.user)  # <-- keep the user loged after password change
            messages.success(request, 'Your password was successfully updated!', extra_tags='safe')
        else:
            messages.error(request, 'Something went wrong', extra_tags='safe')
    else:
        password_form = PasswordChangeForm(instance = request.user)
    return render(request, 'registration/password_change_form.html', {'password_form': password_form})

password_change_form.html:

<form action='.' method='post' enctype='multipart/form-data'>
    <p>
        <label for='id_old_password'>Old password:</label>
        <input type='password' name='old_password' autofocus='' required='' id='id_old_password'>
    </p>
    {% if messages %}
        {% for message in messages %}
            <p class='border-alert {{ message.tags }}'>{{ message|safe }}</p>
        {% endfor %}
    {% endif %} 
    <p>
        <label for='id_new_password1'>New password:</label>
        <input type='password' name='new_password1' required='' id='id_new_password1'>
        <span class='helptext'></span>
    </p>
    <p>
        <label for='id_new_password2'>New password confirmation:</label>
        <input type='password' name='new_password2' required='' id='id_new_password2'>
    </p>
    {% csrf_token %}
    <p><input type='submit' value='Change you password' class='btn w100'></p>
</form>

此页面底部可见Django PasswordChangeForm类:https://github.com/django/django/blob/master/django/contrib/auth/forms.py

编辑:

通过对代码的以下更改,我几乎解决了我的问题:

现在在我的 views.py 中,我有了这个:

@login_required
def password_change(request):
    password_form = PasswordChangeForm(instance = request.user, data = request.POST)
    if request.method == 'POST':
        if password_form.is_valid():
            password_form.save()
            update_session_auth_hash(request, password_form.user)  # <-- keep the user loged after password change
    return render(request, 'registration/password_change_form.html', {'password_form': password_form})

在我的模板中,我使用了这个

{% for field in form %}
    {{ field.errors }}
{% endfor %}

我不再在模板中使用{%if messages%}部分。

错误消息是“提供的Django内置功能”,当我正确填写输入内容后,我将重定向到“更改密码成功视图”。

1 个答案:

答案 0 :(得分:0)

这是正在发生的事情,

在您看来,您不会重定向到任何其他页面。这意味着您再次请求相同的表格。由于这是一个表单获取函数,因此您的成功消息始终为False。

然后您可以执行以下其中一项操作

  1. 添加form.errors。当您使用Django的内置密码重置表单时。如果您的密码不匹配或旧密码不正确,则会显示错误。

    重定向到个人资料页面或任何其他页面。在此处添加消息标签。它将在该页面中完美运行。

  2. (我没有尝试过,通常我会重定向到个人资料页面并在其中显示消息,但是如果您愿意,可以尝试,不确定是否可以使用),

    def password_change(request):
        form = #add form
        success = False
        if request.method == 'POST':
            if form.is_valid():
            form.save()
            update_session_auth_hash(request, password_form.user)
            form = #add form
            success = True
        return render(request, 'template.html', {'form': form})