当前位置:   article > 正文

【Django】Django内建用户系统_django创建用户

django创建用户

Django内建用户系统

14.1 Django中的用户认证

14.2 用户系统表的基本字段

模型类位置 from django.contrib.auth.models import User

字段名含义
username用户名
password密码
email邮箱
first_name
last_name
is_superuser是否管理员账号
is_staff是否可以访问admin管理界面
is_active是否是活跃用户,默认为True,一般不删除用户,而是将用户的is_active设为False
last_login上一次登录时间
date_joined用户创建的时间

14.3 用户系统的基本模型操作

  1. 创建普通用户 create_user:

    1. from django.contrib.auth.models import User
    2. user = User.objects.create_user(username='用户名', password='密码', email='邮箱', ...)

  2. 创建超级用户 create_superuser:

    1. from django.contrib.auth.models import User
    2. user = User.objects.create_superuser(username='用户名', password='密码', email='邮箱', ...)

  3. 删除用户:

    1. from django.contrib.auth.models import User
    2. try:
    3.    user = User.objects.get(username='用户名')
    4.    user.is_active = False
    5.    user.save()
    6.    print("删除普通用户成功")
    7. except:
    8.    print("删除普通用户失败")

  4. 校验密码:

    1. # 说明:如果用户名密码校验成功则返回对应的User对象,否则返回None
    2. from django.contrib.auth import authenticate
    3. user = authenticate(username=username, password=password)

  5. 修改密码:

    1. from django.contrib.auth.models import User
    2. try:
    3.    user = User.objects.get(username='用户名')
    4.    user.set_password('123456')
    5.    user.save()
    6.    print("修改密码成功")
    7. except:
    8.    print("修改密码失败")

  6. 登录状态保持:

    1. from django.contrib.auth import login,authenticate
    2. def login_view(request):
    3.    user = authenticate(username='用户名', password='密码')
    4.    login(request, user)

  7. 登录状态校验:

    1. from django.contrib.auth.decorators import login_required
    2. @login_required
    3. def index_view(request):
    4.    # 该视图必须为用户登录状态下才可以访问
    5.    # 当前登录用户可以通过request.user获取
    6.    login_user = request.user
    7.    ...

  8. 用户注销登录:

    1. from django.contrib.auth import logout
    2. def logout_view(request):
    3.    logout(request)

代码示例:

  1. 创建 templates 目录,放置 html 页面。

  2. 编写对应的template页面。

    register.html,用户注册页。

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.    <meta charset="UTF-8">
    5.    <title>Register</title>
    6. </head>
    7. <body>
    8.    <form method="post" action="{% url 'register_page' %}">
    9.       {% csrf_token %}
    10.       {{ form }}
    11.        <input type="submit" value="Submit">
    12.    </form>
    13. </body>
    14. </html>

    login.html,用户登录页。

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.    <meta charset="UTF-8">
    5.    <title>Login</title>
    6. </head>
    7. <body>
    8.    <form method="post" action="{% url 'login' %}">
    9.       {% csrf_token %}
    10.       {{ form }}
    11.        <input type="submit" value="Submit">
    12.    </form>
    13. </body>
    14. </html>

    homepage.html,首页。

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.    <meta charset="UTF-8">
    5.    <title>homepage</title>
    6. </head>
    7. <body>
    8.    <form method="post" action="{% url 'logout' %}">
    9.       {% csrf_token %}
    10.       欢迎访问项目
    11.        <input type="submit" value="注销用户">
    12.    </form>
    13. </body>
    14. </html>

  3. 编写对应的视图函数。

    1. from django.shortcuts import render
    2. from django.contrib.auth.models import User
    3. from django.http import HttpResponseRedirect, HttpResponse
    4. from django.contrib.auth import authenticate, login, logout
    5. from .forms import loginForm, registerForm
    6. from django.contrib.auth.decorators import login_required
    7. # Create your views here.
    8. def login_page(request):
    9.    """
    10.   项目登录面
    11.   :param request:
    12.   :return:
    13.   """
    14.    # return render(request, 'hello.html')
    15.    if request.method == 'POST':
    16.        form = loginForm(request.POST)
    17.        if form.is_valid():
    18.            # 处理表单提交逻辑,可以访问 form.cleaned_data 获取表单字段的值
    19.            username = form.cleaned_data['username']
    20.            password = form.cleaned_data['password']
    21.            if not username or not password:
    22.                return HttpResponse("请输入正确的参数")
    23.            # 校验密码
    24.            user = authenticate(username=username, password=password)
    25.            print('校验用户')
    26.            print(user)
    27.            if not user:
    28.                return HttpResponse("用户名或密码错误")
    29.            else:
    30.                # 记录会话状态
    31.                login(request, user)
    32.                return HttpResponseRedirect('/homepage')
    33.    else:
    34.        form = loginForm()
    35.    return render(request, 'login.html', {'form': form})
    36. def register_page(request):
    37.    """
    38.   项目注册页面
    39.   :param request:
    40.   :return:
    41.   """
    42.    # return render(request, 'hello.html')
    43.    if request.method == 'POST':
    44.        form = registerForm(request.POST)
    45.        if form.is_valid():
    46.            # 处理表单提交逻辑,可以访问 form.cleaned_data 获取表单字段的值
    47.            username = form.cleaned_data['username']
    48.            password1 = form.cleaned_data['password1']
    49.            password2 = form.cleaned_data['password2']
    50.            if not username or not password1 or not password2:
    51.                return HttpResponse("请传入正确的参数")
    52.            # 进行注册操作
    53.            try:
    54.                if password1 != password2:
    55.                    return HttpResponse("两次输入的密码不一致")
    56.                # 创建用户
    57.                user = User.objects.create_user(username=username, password=password1)
    58.                # 注册成功
    59.                return HttpResponseRedirect('/login')
    60.            except Exception as e:
    61.                # 注册失败
    62.                print(e)
    63.                return HttpResponse("注册用户失败,请联系管理员进行处理")
    64.    else:
    65.        form = registerForm()
    66.    return render(request, 'register.html', {'form': form})
    67. def logout_func(request):
    68.    """
    69.   注销登录
    70.   :param request:
    71.   :return:
    72.   """
    73.    logout(request)
    74.    return HttpResponseRedirect('/login')

  4. 编写对应的路由函数。

    1. from django.urls import path, re_path
    2. from . import views
    3. urlpatterns = [
    4.    path("", views.login_page, name='login'),
    5.    path("register/", views.register_page, name='register_page'),
    6.    path("logout/", views.logout_func, name='logout')
    7. ]

  5. 配置项目默认的登录页面。

    1. # settings.py
    2. # 配置了登录地址,当访问到需要登录的页面时,如果此时用户未登录,则跳转至登录页面
    3. LOGIN_URL = '/login'
    '
    运行

  6. 页面调用测试。

    注册页面输入用户名,密码,确认密码后点击submit进行登录。

    成功注册后,跳转至login页面,输入刚才注册的用户名和密码,点击submit进行登录。

    登录成功,跳转至项目首页。

    再打开一个标签页,注销登录后,项目首页无法访问。

14.4 用户系统的扩展字段

  • 通过建立新表,跟内建表做一对一映射。

  • 继承内建的抽象User模型类。

14.4.1 继承内部抽象类

步骤:

  1. 添加新的应用。

  2. 定义模型类,集成AbstractUser。

  3. settings.py中指明AUTH_USER_MODEL='应用名.类名'。

注:该操作需要在第一次migrate之前进行,否则会报如下的错误。

代码测试:

  1. 添加新的应用。

    python3 manage.py startapp useradmin

  2. 定义模型类,集成AbstractUser。

    1. from django.db import models
    2. from django.contrib.auth.models import AbstractUser
    3. # Create your models here.
    4. class UserInfo(AbstractUser):
    5.    phone = models.CharField(max_length=11, default='')

  3. settings.py中指明AUTH_USER_MODEL='应用名.类名'。

    AUTH_USER_MODEL = 'useradmin.UserInfo''
    运行

  4. 执行代码迁移。

    1. python3 manage.py makemigrations
    2. python3 manage.py migrate
  5. 迁移成功后,查看数据库,auth_user表消失,出现了一个useradmin_userinfo的表。

  6. 创建新用户测试。

    1. from django.contrib.auth.models import User
    2. user = User.objects.create_user(username='euansu', password='euansu', email='euansu@euansu.cn', phone=13000000000)

    查看数据库

    使用新创建的用户登录刚才的项目,可以正常登录。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/865183
推荐阅读
相关标签
  

闽ICP备14008679号