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

文章目录

往期回顾

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

让用户能够输入数据

创建用户账户

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

应用程序 users

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

python 复制代码
# 控制台中打开虚拟环境
ll_env\Scripts\activate

# 创建users应用程序
python manage.py startapp users

#查看创建后项目状态
dir
#查看user结构
dir users

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

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

python 复制代码
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加自己的模型
    'learning_logs',
    'users',
]

users 的 URL

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

python 复制代码
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')),
]

登录页面

user应用程序下新建 urls.py

python 复制代码
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'),
]

模板login.html

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

python 复制代码
{% 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 %}

链接到登录页面

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

python 复制代码
<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 %}

效果预览


注销

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

注销URL

python 复制代码
# 注销
    re_path(r'^logout/$', views.logout_view, name='logout'),

视图函数

python 复制代码
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'))

链接到注销视图

python 复制代码
<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 %}

效果预览

注册页面

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

注册页面的URL

python 复制代码
# 注册
    re_path(r"^register/$", views.register, name='register'),

视图函数

python 复制代码
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)

注册模板

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

python 复制代码
{% 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 %}

链接到登录页面

python 复制代码
<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 %}

效果预览

相关推荐
largecode28 分钟前
打电话时,怎么让号码显示自己的品牌名称?办理号码认证服务流程
笔记·百度·微信·课程设计·微信公众平台·facebook·新浪微博
2301_7838486529 分钟前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
CLX05051 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
米罗篮2 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程
老纪2 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
噜噜噜阿鲁~2 小时前
python学习笔记 | 10.0、面向对象编程
笔记·python·学习
weixin199701080162 小时前
[特殊字符] RESTful API 接口规范详解:构建高效、可扩展的 Web 服务(附 Python 源码)
前端·python·restful
hssfscv3 小时前
软件设计师下午题训练1-3题+2019上上午题错题解析 练习真题训练13
笔记·设计模式·uml
2301_781571423 小时前
mysql数据库响应缓慢如何排查_使用EXPLAIN分析执行计划
jvm·数据库·python
彳亍1013 小时前
实现倒计时数字在到达1后自动隐藏(2为最后可见数字),同时继续运行至-1再终止
jvm·数据库·python