学习日记之《Django3 Web应用开发实战》——第十章——Auth 认证系统

第十章------Auth 认证系统

内置USER 实现用户管理

python 复制代码
# 举例说明
def setpsView(request):
    title = '修改密码'
    pageTitle = '修改密码'
    password2 = True
    if request.method == 'POST':
        u = request.POST.get('username', '')
        p = request.POST.get('password', '')
        p2 = request.POST.get('password2', '')
        if User.objects.filter(username=u):
            user = authenticate(username=u, password=p)
            if user:
            	# 方式一
                user.set_password(p2)  将该用户密码设置为p2
                # 方式2
                dj_ps = make_password(p2, salt=None, hasher='pbkdf2_sha256')
                user.password = dj_ps

                user.save()
                tips = '密码修改成功'
            else:
                tips = '原始密码不正确'
        else:
            tips = '用户不存在'
    return render(request, 'user.html', locals())

模型USER的拓展和使用

python 复制代码
# models.py
编写拓展模型
from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class MyUser(AbstractUser):
    qq = models.CharField('QQ号码', max_length=16)
    wechat = models.CharField('微信账号', max_length=100)
    mobile = models.CharField('手机号码', max_length=11)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = '用户信息'
python 复制代码
# settings.py
AUTH_USER_MODEL = 'user1.MyUser'
python 复制代码
# admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _

from .models import MyUser

# Register your models here.
@admin.register(MyUser)
class MyUserAdmin(UserAdmin):
    list_display = ('username', 'email', 'mobile', 'qq', 'wechat')
    fieldsets = list(UserAdmin.fieldsets)
    fieldsets[1] = (_('Personal info'),
                    {'fields': ('first_name', 'last_name',
                                'email', 'mobile', 'qq', 'wechat')})
python 复制代码
forms.py
# Django 自带的用户表
from django.contrib.auth.forms import UserCreationForm
from .models import MyUser

class MyUserCreationForm(UserCreationForm):
    class Meta:
        model = MyUser
        fields = UserCreationForm.Meta.fields
        fields += ('email', 'mobile', 'wechat', 'qq')

自定义用户权限

python 复制代码
# models.py   在模型处的permissions 以元组的方式添加权限,清空原有的数据表,重新执行数据迁移
from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class MyUser(AbstractUser):
    qq = models.CharField('QQ号码', max_length=16)
    wechat = models.CharField('微信账号', max_length=100)
    mobile = models.CharField('手机号码', max_length=11)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = '用户信息'
        verbose_name_plural = '用户信息'

        # 自定义权限
        permissions = (
            ('vip_myuser', 'Can vip user'),
        )
python 复制代码
views.py

def registerView_1(request):
    userLogin = False
    if request.method == 'POST':
        user = MyUserCreationForm(request.POST)
        if user.is_valid():
            user.save()
            tips = '注册成功'
            # 添加权限
            # 由表单对象user 的 instance获取对应的模型对象
            u = user.instance
            p = Permission.objects.filter(codename='vip_myuser')[0]
            print('pp', p)
            u.user_permissions.add(p)
            return redirect(reverse('user1:login_1'))
        else:
            tips = '注册失败'
    user = MyUserCreationForm()
    return render(request, 'user2.html', locals())

@login_required(login_url='/login_1.html')
@permission_required(perm='user1.vip_myuser', login_url='/login_1.html')
def infoView(request, user_id):
    user = MyUser.objects.filter(id=user_id)[0]
    # p = Permission.objects.filter(codename='vip_myuser')[0]
    if user.has_perm('user1.vip_myuser'):
        print('has')
    else:
        print('not has')
    return render(request, 'info.html', locals())
python 复制代码
html
<!doctype html>
<html>
<head>
{% load static %}
<title>用户信息</title>
<link rel="stylesheet" href="{% static 'css/common.css' %}">
<link rel="stylesheet" href="{% static 'css/home.css' %}">
</head>
<body class="member">
    <div class="mod_profile js_user_data">
        <div class="section_inner">
        	{#模板上下文user是User或AnoymousUser对象#}
	        {#user由模型MyUser实例化#}
            {% if user.is_authenticated %}
            <div class="profile__cover_link">
                <img src="{% static 'image/user.jpg' %}" class="profile__cover">
            </div>
            <h1 class="profile__tit">
                <span class="profile__name">{{ user.username }}</span>
            </h1>
            {#模板上下文perms是模型Permission实例化对象#}
	        {% if perms.user1.vip_myuser %}   # user1 应用名
                <div class="profile__name">VIP会员111</div>
            {% endif %}
                <a href="{% url 'user1:logout_1' %}" style="color:white;">退出登录</a>
            {% endif %}
        </div>
    </div>
</body>
</html>

PS:TEMPLATES 定义了处理器集合 context_processors,运行到处理器auth时,程序会生成变量user 和 perms , 并将该变量传入模板上下文TemplateContext中,所以才可以在模板中使用该变量。
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
相关推荐
冷崖10 分钟前
const 与 constexpr
c++·学习
wenjie学长17 分钟前
[UE学习笔记]—划时代意义的两大功能—lumen和Nanite
笔记·学习·ue·三维数字化
好奇龙猫18 分钟前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(6):文法運用
学习
文火冰糖的硅基工坊22 分钟前
[人工智能-大模型-43]:模型层技术 - 强化学学习:学习的目标、收敛条件、评估依据、应用到的模型、应用场景 - 通俗易懂。
人工智能·学习
Mintopia23 分钟前
🤖 算法偏见修正:WebAI模型的公平性优化技术
前端·javascript·aigc
Mintopia26 分钟前
🧩 TypeScript防御性编程:让Bug无处遁形的艺术
前端·typescript·函数式编程
JarvanMo28 分钟前
🔔 Flutter 本地通知: 吸引用户的完整指南—即使在他们离线时也能实现
前端
你想考研啊33 分钟前
一、redis安装(单机)和使用
前端·数据库·redis
江城开朗的豌豆35 分钟前
小程序与H5的“握手言和”:无缝嵌入与双向通信实战
前端·javascript·微信小程序
天蓝色的鱼鱼35 分钟前
React 19 发布一年后:对比 React 18,带来了哪些惊喜与变革
前端·react.js