• 用Django 写学习笔记程序第二章.2创建用户账户


    往期回顾

    学习Django编写"学习笔记"程序

    让用户能够输入数据

    创建用户账户

    建立一个用户注册和身份证系统,让用户能够注册账户,进而登录和注销。

    应用程序 users

    用 startapp 创建一个名为users的应用程序

    # 控制台中打开虚拟环境
    ll_env\Scripts\activate
    
    # 创建users应用程序
    python manage.py startapp users
    
    #查看创建后项目状态
    dir
    #查看user结构
    dir users
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    将 users 应用程序添加到项目中

    打开settings.py文件,在 INSTALLED_APPS 处进行添加。

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # 添加自己的模型
        'learning_logs',
        'users',
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    users 的 URL

    修改项目根部目录的urls.py,使其包含users的URL

    urlpatterns = [
        path('admin/', admin.site.urls),
        path(r'^users/', include(('users.urls', 'users'), namespace='users')),
        path(r'', include(('learning_logs.urls', 'learning_logs'), namespace='learning_logs')),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    登录页面

    user应用程序下新建 urls.py

    from django.urls import re_path
    from django.contrib.auth.views import LoginView
    
    from . import views
    
    urlpatterns =[
        #登录页面
        re_path(r'^login/$', LoginView.as_view(template_name='users/login.html'), name='login'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    模板login.html

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

    {% extends "learning_logs/base.html" %}
    {% block content %}
        {% if form.errors %}
            <p>Your usersname 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="text" value="{% url 'learning_logs:index' %}" />
        </form>
    {% endblock content %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    链接到登录页面

    base.html 中添加到登录页面的链接,让所有页面都包含它。

    <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 %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    效果预览

    在这里插入图片描述
    在这里插入图片描述

    注销

    现在需要给用户提供一个注销的页面,我们不创建用于注销的页面,而是让用户只需点击一个链接就能注销并返回到主页。

    注销URL

    # 注销
        re_path(r'^logout/$', views.logout_view, name='logout'),
    
    • 1
    • 2

    视图函数

    from django.shortcuts import render
    
    from django.http import HttpResponseRedirect
    from django.urls import reverse
    from django.contrib.auth import logout
    
    
    # 注销用户
    def logout_view(request):
        logout(request)
        return HttpResponseRedirect(reverse('learning_logs:index'))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    链接到注销视图

    <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 }}.
            <a href="{% url 'users:logout' %}">log out</a>
            {% else %}
                <a href="{% url 'users:login' %}">log in</a>
        {% endif %}
    </p>
    
    {% block content %}{% endblock content %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    效果预览

    在这里插入图片描述

    注册页面

    创建让新用户可以注册的页面,我们使用Django提供的表单UserCreationForm,但编写自己的视图函数和模板

    注册页面的URL

    # 注册
        re_path(r"^register/$", views.register, name='register'),
    
    • 1
    • 2

    视图函数

    from django.shortcuts import render
    
    from django.http import HttpResponseRedirect
    from django.urls import reverse
    from django.contrib.auth import logout, login, authenticate
    from django.contrib.auth.forms import UserCreationForm
    
    # 注册新用户
    def register(request):
        if request.method != 'POST':
            # 显示空的注册表单
            form = UserCreationForm()
        else:
            # 处理写好的表单
            form = UserCreationForm(data=request.POST)
    
            if form.is_valid():
                new_user = form.save()
                # 让用户自动登录,再重定向到主页
                authenticate_user = authenticate(username=new_user.username, password=request.POST['password1'])
                login(request, authenticate_user)
                return HttpResponseRedirect(reverse('learning_logs:index'))
        context = {'form': form}
        return render(request, 'users/register.html', context)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    注册模板

    register.html 存储在login.html所在目录

    {% extends "learning_logs/base.html" %}
    {% block content %}
        <form method="post" action="{% url 'users:register' %}">
            {% csrf_token %}
            {{ form.as_p }}
        
            <button name="submit">register</button>
            <input type="hidden" name="next" value="{% url 'learning_logs:index' %}"/>
        </form>
    {% endblock content %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    链接到登录页面

    <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 }}.
            <a href="{% url 'users:logout' %}">log out</a>
            {% else %}
                <a href="{% url 'users:register' %}">register</a>
                <a href="{% url 'users:login' %}">log in</a>
        {% endif %}
    </p>
    
    {% block content %}{% endblock content %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    效果预览

    在这里插入图片描述

  • 相关阅读:
    http概念
    1905. 统计子岛屿
    FL Studio21.2破解版更新下载
    uniapp小程序长按识别关注公众号
    Linux 本地RStudio 工具安装&远程访问
    MCU软核 2. Xilinx Artix7上运行tinyriscv
    【Spring boot 导入 spring XML 配置文件】
    【springboot项目详解】springboot项目整合-注册功能模块开发
    网络安全(黑客)自学
    进程与线程的区别
  • 原文地址:https://blog.csdn.net/tianlei_/article/details/136492301