Young87

当前位置:首页 >个人收藏

Django初学者笔记系列(七):创建用户账户

在这一节,我们将建立一个用户注册和身份验证系统,让用户能够注册账户,进而登录和注销。我们将创建一个新的应用程序,其中包含与处理用户账户相关的所有功能。我们还将对模型Topic 稍做修改,让每个主题都归属于特定用户。

应用程序users

我们首先使用命令startapp 来创建一个名为users 的应用程序:

(ll_env) nanimatoMacBook-Air:learning_log heguanlin$ python3 manage.py startapp users

1.将应用程序users 添加到settings.py中

在settings.py中,我们需要将这个新的应用程序添加到INSTALLED_APPS 中

2.包含应用程序users 的URL

接下来,我们需要修改项目根目录中的urls.py,使其包含我们将为应用程序users 定义的URL:

from django.conf.urls import url
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'', include(('learning_logs.urls', 'learning_logs'), namespace='learning_logs')),
    url(r'^users/', include('users.urls', namespace='users')),
]

这行代码与任何以单词users打头的URL(如http://localhost:8000/users/login/)都匹配。我们还创建了命名空 间’users’ ,以便将应用程序learning_logs 的URL同应用程序users 的URL区分开来。

登录页面

我们首先来实现登录页面的功能。为此,我们将使用Django提供的默认登录视图,因此URL模式会稍有不同。在目录learning_log/users/中,新建一个名为urls.py的文件,并在其中添加如下代码:

from django.conf.urls import url
from django.contrib.auth.views import LoginView
urlpatterns = [
    #登录界面  LoginView.as_view后面要加上()
    url(r'^login/$',LoginView.as_view(template_name='users/login.html'),name='login')
]

我们首先导入了默认视图login。登录页面的URL模式与URL http://localhost:8000/users/login/匹配。这个URL中的单词users让Django在users/urls.py中查找,而单词login让它将请求发送给Django默认视图login (请注意,视图实参为login ,而不是views.login )。鉴于我们没有编写自己的视图函数,我们传递了一个字典,告诉Django去哪里查找我们将编写的模板。这个模板包含在应用程序users而不是learning_logs 中。

1.模板login.html

用户请求登录页面时,Django将使用其默认视图login ,但我们依然需要为这个页面提供模板。为此,在目录learning_log/users/中,创建一个名为templates的目录,并在其中创建一个名为users的目录。以下是模板login.html,你应将其存储到目录learning_log/users/templates/users/中:

{% extends 'learning_logs/base.html' %}

{% block content %}
  {% if form.errors %}
    <p>Your username and password didn't match. Please try again.</p>
  {% endif %}

  <form method="post" action="{% url 'users:login' %}">
    {% csrf_token %}
     {{ form.as_p }}
      <button name="submit">log in</button>
      <input type="hidden" name="next" value="{% url 'learning_logs:index' %}" />

  </form>



{% endblock content %}

这个模板继承了base.html,旨在确保登录页面的外观与网站的其他页面相同。请注意,一个应用程序中的模板可继承另一个应用程序中的模板。

如果表单的errors 属性被设置,我们就显示一条错误消息

我们要让登录视图处理表单,因此将实参action 设置为登录页面的URL。登录视图将一个表单发送给模板,在模板中,我们显示这个表单并添加一个提交按钮。我们包含了一个隐藏的表单元素——‘next’ ,其中的实参value 告诉Django在用户成功登录后将其重定向到什么地方——在这里是主页。

2.链接到登录页面

下面在base.html中添加到登录页面的链接,让所有页面都包含它。用户已登录时,我们不想显示这个链接,因此将它嵌套在一个{% if %}标签中:

<p>
    <a href="{% url 'learning_logs:index' %}">Learning Log</a> -
    <a href="{% url 'learning_logs:topics' %}">Topics</a> -
      {% if user.is_authenticated %}
        Hello, {{ user.username }} .
      {% else %}
        <a href="{% url 'users:login' %}">log in</a>
      {% endif %}
</p>

  {% block content %}{% endblock content %}

在Django身份验证系统中,每个模板都可使用变量user ,这个变量有一个is_authenticated 属性:如果用户已登录,该属性将为True ,否则为False 。这让你能够向已 通过身份验证的用户显示一条消息,而向未通过身份验证的用户显示另一条消息。

3.使用登陆页面

前面建立了一个用户账户,下面来登录一下,看看登录页面是否管用。请访问http://localhost:8000/admin/,如果你依然是以管理员的身份登录的,请在页眉上找到注销链接并单击它。注销后,访问http://localhost:8000/users/login/。在这个主页的页眉中,显示了一条个性化问候语,其中包含你的用户名。

期间出现TypeError at /users/login/ login() got an unexpected keyword argument 'template_name'这个错误,原因是在Django2.0中内置登陆视图不再是函数,而是类,位置在django.contrib.auth.views.LoginView

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 服务器被攻击了怎么办

下一篇: Blockchain Product Traceability Solution - Based on SunlightDB Database

精华推荐