修改密码

2017-06-2616705 阅读24 评论

再此之前我们已经完成了用户登录、注册、注销等功能,接下来让我们继续为用户提供修改密码的功能。该功能 Django 的 auth 应用也已经为我们提供,过程几乎和之前的登录功能完全一样。

编写修改密码模板

修改密码的的视图函数默认渲染的模板名为 password_change_form.html,因此首先在 registration/ 下新建一个 password_change_form.html 文件,写入表单代码(几乎和登录页面一样),在此就不做过多解释了,具体请参考 Django 用户认证系统:登录 部分的说明。

templates/registration/password_change_form.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>修改密码</title>
    <link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css">
    <style>
        .errorlist {
            color: red;
        }
    </style>
</head>
<body>
<div class="flex-center">
    <div class="container">
        <div class="flex-center">
            <div class="unit-1-2 unit-1-on-mobile">
                <h1><a href="{% url 'index' %}">Django Auth Example</a></h1>
                <h3>修改密码</h3>
                <form class="form" action="{% url 'password_change' %}" method="post">
                    {% csrf_token %}
                    {{ form.non_field_errors }}
                    {% for field in form %}
                        {{ field.label_tag }}
                        {{ field }}
                        {{ field.errors }}
                        {% if field.help_text %}
                            <p class="help text-small text-muted">{{ field.help_text|safe }}</p>
                        {% endif %}
                    {% endfor %}
                    <button type="submit" class="btn btn-primary btn-block">确认修改</button>
                </form>
            </div>
        </div>
    </div>
</div>
</body>
</html>

此外,在首页加一个修改密码的按钮,并且注意只对已登录用户显示:

templates/index.html

{% if user.is_authenticated %}
  <p>你已登录,欢迎你:<a href="#">{{ user.username }}</a></p>
  <button class="btn btn-default"><a href="{% url 'logout' %}?next={{ request.path }}">注销登录</a>
  </button>
  <button class="btn btn-default"><a href="{% url 'password_change' %}?next={{ request.path }}">修改密码</a>
  </button>
{% else %}

编写密码修改成功页面模板

密码修改成功后,Django 会把用户跳转到密码修改成功页面,该页面渲染的模板为 password_change_done.html,因此再添加一个密码修改成功页面的模板:

templates/registration/password_change_done.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>密码修改成功</title>
    <link rel="stylesheet" href="https://unpkg.com/mobi.css/dist/mobi.min.css">
</head>
<body>
<div class="flex-center">
    <div class="container">
        <div>
            <h1 class="logo"><a href="{% url 'index' %}">Django Auth Example</a></h1>
            <p>密码修改成功!</p>
        </div>
    </div>
</div>
</body>
</html>

OK,修改密码的功能就完成了。流程为已登录用户点击主页的修改密码按钮跳转到修改密码页面,修改密码成功后跳转到修改成功页面。

总结

本教程的示例项目代码位于 GitHub:Django Auth Example

如果遇到问题,请通过下面的方式寻求帮助。

更多 Django 相关教程,请访问我的个人博客:追梦人物的博客

-- EOF --

24 评论
登录后回复
Leon
2018-02-07 01:02:36

博主,按提交按钮之后出现报错,ValidationError:['’2‘ 必须为 True 或者 False。']

是怎么回事呢?

回复
Leon Leon
2018-02-07 01:14:30

数据库内部设置了 is_superuser的值为2,因此报错

回复
boyl
2018-01-05 11:30:41

### 博主,你这个修改密码似乎不对,到你的github拿的代码也和我一样报错404 not found。我就不截图,只是陈述。

回复
追梦人物 boyl
2018-01-11 17:31:27

404 not found 可能是你的 url 路由配置出了问题,再检查一下 url 是否正确。

回复
ImportPy
2017-12-12 23:25:33

这文章少了密码存数据库吧??

回复
追梦人物 ImportPy
2017-12-17 09:10:29

django 内置一套完善的安全密码系统

回复
郭效杨
2017-10-26 22:40:40

这里的form哪来的?和注册的form一样?

回复
追梦人物 郭效杨
2017-10-27 17:59:25

django PasswordChangeView 视图函数传给模板的。通过阅读源码可以看到。

回复
郭效杨 追梦人物
2017-11-01 16:09:29

这个是自然的,所以我只想知道这个form是自己写的吗,还是auth认证也带了自己的form,例如usercreatationform

回复
郭效杨 追梦人物
2017-11-01 16:17:14

另外,再请教博主一个问题,django做了一个问答页面用户填写数据后保存成csv了,那么另一个用户登陆后也填写了,那么此时的数据会覆盖,如何才能不覆盖呢?收集到2份数据

回复
追梦人物 郭效杨
2017-11-01 16:29:25

auth模块基本所有的 form 都内置了,位于 django.contrib.auth.forms 模块里。

回复
追梦人物 郭效杨
2017-11-01 16:30:12

你应该为不同的用户填写的数据保存到不同的文件吧?

回复
郭效杨 追梦人物
2017-11-02 15:23:19

是的,不同的用户保存的数据,目前写的注册登录当用户登录后选择了答案,会覆盖前一个用户的数据,怎么办呢

回复
追梦人物 郭效杨
2017-11-08 11:20:15

你应该为新用户提交的数据创建一个新的 csv 文件保存,而不是写入上一个用户的 csv 文件里,这样就不会覆盖了。

回复
mozhemeng
2017-08-13 17:37:06

博主,我想问一下,如果修改密码成功后跳转的是修改成功的页面,那为什么还要传进去next参数呢

回复
追梦人物 mozhemeng
2017-08-13 18:34:15

嗯,修改密码的这个可以不用传。

回复
dgsudfjk
2017-08-08 19:46:28

修改密码和修改成功都是进入了django后台管理了,没有使用自己定义的模板

回复
沉浸丶L dgsudfjk
2017-08-14 12:59:43

+1。。

回复
追梦人物 dgsudfjk
2017-08-14 15:15:42

这很可能是你的模板路径放置错误。

回复
Con amore 追梦人物
2017-08-19 14:12:24

registration/目录要放在项目根目录的templates/下才能用自己定义的模板,放在users/templates下就用django内置的,我想把registration/这个目录放在users/templates下并且用自己定义的模板应该怎么改?

回复
追梦人物 Con amore
2017-08-20 10:35:12

这需要定制登录、注册等视图函数,你可以把 users 的模板放到 registration 下去,这样就只有一个文件夹了。

回复
我他丫的sei Con amore
2019-07-28 17:45:08

registration/目录放在项目根目录的templates/下了,用的还是django内置的模板,有点懵

回复
我他丫的sei 我他丫的sei
2019-07-28 18:05:04

好了解决了,文件名多了一个s...

回复
阿狸打篮球
2017-07-01 10:37:03

测试

回复