Django——Auth模块以及admin站点

Django------Auth模块

一、Auth 模块

Auth 用户认证,本质上也是设置 Session。

复制代码
Django 认证系统同时处理认证和授权
	认证:验证一个用户是否为 django 声明的用户,如果是可以进行登录
	授权:决定一个已经验证的用户有哪些功能是允许操作。

在 django 迁移数据库的是时候会自动生成一个用户认证表:auth_user , 存放用户基本信息(用户名 , 密码,邮箱......)

复制代码
扩建 auth_user 表中的字段数据

方法一:(不推荐)
	创建一对一,绑定 auth_user 表

方法二:继承AbstractUser
在定义模型类的时候继承 AbstractUser , 进行数据库迁移不会生成 auth_user , 原有 auth_user 中的字段就继承到自定义的模型类中。
实现字段的扩建,直接在自定义模型类中添加额外新的字段即可。

扩建 auth_user 表的前提:
	1、在实现扩建的时候,不允许,不能先执行迁移数据库(如果已经迁移过数据,那么就换一个新的数据库)
	2、在扩建中,只能添加字段,不可以修改原有的字段。

重新配置 auth 认证模型类

python 复制代码
# 配置自定义认证模型类
# AUTH_USER_MODEL = '应用名称.类名称'
AUTH_USER_MODEL = 'AuthApp.User'
python 复制代码
from django.shortcuts import render , HttpResponse , redirect
from django.views import View
from AuthApp.models import User
from django.contrib.auth import authenticate , login

def index(request):
    # request.user , 获取用户名
    # AnonymousUser 匿名用户,表示用户名为登录
    print(request.user)
    # 判断用户是否登录
    print(request.user.is_authenticated)
    return render(request , 'index.html')

class RegisterView(View):

    def get(self , request):
        return render(request , 'register.html')

    def post(self , request):
        name = request.POST.get('username')
        password = request.POST.get('password')
        email = request.POST.get('email')
        mobile = request.POST.get('mobile')
        '''
        create:保存用户数据 ,密码不加密
        create_user:密码加密
        '''
        User.objects.create_user(username=name , password=password , email=email , mobile=mobile)
        return redirect('/login/')

class LoginView(View):

    def get(self , request):
        return render(request , 'login.html')

    def post(self , request):
        name = request.POST.get('username')
        password = request.POST.get('password')

        # authenticate 认证用户信息 , 用户存在返回用户数据 , 用户不存在返回 None
        user = authenticate(username=name , password=password)

        if not user:
            return render(request , 'login.html' , {'error_message':"用户名或者密码错误"})

        # login 登录成功, 保存用户登录状态
        login(request , user)
        return redirect('/index/')

实现验证登录,以及退出登录

python 复制代码
# 配置全局的登录重定向 url
LOGIN_URL = '/login/'
python 复制代码
from django.contrib.auth.decorators import login_required
'''
login_required 用户验证登录的装饰器
使用的时候需要配置局部的重定向 url
@login_required(login_url='/login/')

配置项目全局的从定向 url , 到配置文件中添加 login_url 的信息
'''
@login_required
def cart(request):
    return HttpResponse('<h1>购物车页面</h1>')

# 注销用户信息之前必须保证用户是登录状态
@login_required
def logoutview(request):
    # 注销用户(清除 Session 中的用户数据)
    logout(request)
    return redirect('/login/')

二、admin 站点

django 提供的网站后台数据管理

创建管理员用户

python 复制代码
python manage.py createsuperuser

注册的时候,用户名不要中文,用户名和密码不要有一串一致的数据 ,邮箱允许为空 。

使用 admin 站点管理模型类数据

python 复制代码
class Goods(models.Model):
    # verbose_name 对 admin站点中的模型类字段名称设置,对数据库不影响
    name = models.CharField(max_length=50 , verbose_name='商品名称')
    price = models.DecimalField(max_digits=11 , decimal_places=3 , verbose_name='价格')
    stock = models.IntegerField(verbose_name='库存')
    sales = models.IntegerField(verbose_name='销量')
    
    class Meta:
        db_table = 'goods'
        #设置 admin 站点中的表名
        verbose_name = '商品数据表'
        verbose_name_plural = verbose_name

注册模型类 ; 到所在应用下的 admin.py 文件中进行注册

python 复制代码
from AdminApp.models import Goods
admin.site.register(Goods)

修改 admin 站点中的应用名称

在所在应用中的__init__.py添加

python 复制代码
default_app_config = 'AdminApp.apps.AdminappConfig'

在对应的应用中的 apps.py 维纳设置站点使用的应用名称

apps.py 的类中添加属性

python 复制代码
verbose_name = '商品表'

admin 模型类数据操作 , 在 admin.py 文件中操作

python 复制代码
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):

    # list_display 在站点中显示指定字段数据信息
    list_display = ['id' , 'name' , 'price' , 'sales']

    # list_filter 选择指定的字段作为条件过滤
    list_filter = ['name' , 'sales']

    # list_per_page 设置分页 , 指定每一页有多少条数据
    list_per_page = 2

    # search_fields 配置搜索条件,数据类型要用元组
    search_fields = ('id' , 'name')

    # list_editable 在显示列表页中设置允许修改的字段数据
    list_editable = ('name' , 'price')

    # # fields 在编辑页中指定字段允许修改
    # fields = ('name' , 'price')

    # fieldsets 设置编辑页分组显示数据
    fieldsets = (
        # ('分组名称' , {'fields':[指定字段名]}
        ('商品基本信息' , {'fields':['name' , 'price']}),
        ('商品销量信息' , {'fields':['sales' , 'stock']})
    )

    # 设置只读字段
    readonly_fields = ('name',)

在 admin 站点中可以自定义字段数据 , 不影响数据库

python 复制代码
def num(g):
    # 参数 g , 下面的类会自动的将模型类传入
    add = g.price * g.sales
    return add
# 制作 num 在 admin 站点中的字段名
num.short_description = '商品销售额'

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):

    # list_display 在站点中显示指定字段数据信息
    list_display = ['id' , 'name' , 'price' , 'sales' , num]

遭周文而舒志

链接:https://pan.baidu.com/s/1ir9eM2kL2D7hU9ZTNu4-Xw

提取码:malw

相关推荐
数据智能老司机2 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机3 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机3 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机3 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i3 小时前
drf初步梳理
python·django
每日AI新事件3 小时前
python的异步函数
python
这里有鱼汤4 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook13 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室14 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三15 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试