Django 后台管理学习笔记

本文详细介绍了Django框架的后台管理配置,包括如何自动生成管理界面、配置ORM模型、优化查询速度、格式化字段显示以及实现快捷搜索和关联搜索。同时,展示了如何自定义模型字段、表单验证、保存逻辑以及添加批量操作功能。还提及了在后台使用富文本编辑器的集成方法。
摘要由CSDN通过智能技术生成

一、关于Django后台管理

1.框架自动生成的后台管理

2.从ORM模型中读取元数据,简单配置即可使用

3.功能强大,可以用于对数据库中数据的管理

二、实现步骤

第一步:框架部分的配置

步骤一、INSTALLED_APPS配置应用及依赖

INSTALLED_APPS = [
    
    'django.contrib.admin',
    'django.contrib.auth',
  ]

步骤二、模板选项配置TEMPLATES中的OPTIONS

添加上下文处理器:context_processors

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',
            ],
        },
    },
]

步骤三、添加中间件MIDDLEWARE

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    
    # 这个
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 和这个
    'django.contrib.messages.middleware.MessageMiddleware',

    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

步骤四、配置URL

from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
]

第二步,ORM模型中配置

步骤1:在模块下新建admin.py文件

步骤2:封装模型自定义的管理后台功能和选项

每个模型创建一个ModelAdmin的子类

ModelAdmin配置选项

  • fields/exclude ---- 需要编辑/不需要编辑的字段列表
  • form ---- 自定义表单
  • list_display  ----  在列表中显示的字段
  • ordering --- 指定排序规则

步骤3:INSTALLED_APPS配置应用

需要管理的ORM模型自动搜索添加至后台管理

'accounts.app.AccountsConfig',
'system.appSystemConfig'

三、使用admin的一些优化配置

3.1、后台管理配置为中文

配置语言
LANGUAGE_CODE = 'zh-hans'

配置时区
TIME_ZONE = 'Asia/Shanghai'

模型
verbose_name = '用户详细信息'

3.2 查询速度优化

分析问题

1.减少每页的数据大小

2.减少SQL查询的次数

解决思路

list_per_page ---- 分页大小,默认每页100条

list_select_related  ---- 外键关联查询优化

3.3 格式化显示字段内容

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    """用户详细信息表"""

    list_display = ('format_username','sex','age','created_at')
    list_per_page = 5
    list_select_related = ('user',)

    def format_username(self,obj):
        # 用户名脱敏处理
        return obj.username[:3] + '***'

    format_username.short_description = '用户名'

3.4、快捷搜索

list_filter = ('sex',)  配置一些有choices的一些字段

3.5、 关联搜索

场景:按用户名、昵称搜索用户

search_fields  ---  支持搜索的字段

四、自定义模型配置

  • 定制个性化的列表显示字段
  • 限制可以编辑的模型字段
# 表单中可以编辑的字段,写进field中的可以编辑
fields = ('real_name','email','phone_no','sex','age')
  • 自定义后台模型的表单验证

# form中定义表单
class ProfileEditForm(forms.ModelForm):
    """用户详细信息编辑"""
    class Meta:
        model = Profile
        fields = ('real_name','email','phone_no','sex','age')

    def clean_age(self):
        age = self.cleaned_data['age']
        if int(age) >= 120 or int(age) <= 1:
            raise forms.ValidationError('年龄只能在1-120之间')
        return age
form = ProfileEditForm   # admin.py中引用
  • 重写保存方法,执行其他业务逻辑
class ProfileEditForm(forms.ModelForm):
    """用户详细信息编辑"""
    class Meta:
        model = Profile
        fields = ('real_name','email','phone_no','sex','age')

    def clean_age(self):
        age = self.cleaned_data['age']
        if int(age) >= 120 or int(age) <= 1:
            raise forms.ValidationError('年龄只能在1-120之间')
        return age
    
    # 重写save方法
    def save(self, commit=False):
        obj = super().save(commit)
        # 保存数据做其他处理
        if not obj.source:
            obj.source = 'web'
            obj.save()
        return obj
  • 新增批量操作功能
@admin.register(User)
class MyUserAdmin(UserAdmin):
    """用户基础信息管理"""
    # 列表中显示的内容
    list_display = ('username','nickname','is_active','is_staff','date_joined')
    # 搜索字段
    search_fields = ('username','nickname')
    # 新增的字段
    add_fieldsets = UserAdmin.add_fieldsets + (
        (None,{'fields':('nickname',)}),
    )

    # 修改的表单
    fieldsets = UserAdmin.fieldsets + (
        (None,{'fields':('nickname','avatar')}),
    )

    actions = ['disable_user','enable_user']

    # 批量禁用用户
    def disable_user(self,request,queryset):

        queryset.update(is_active=False)

    disable_user.short_description = '批量禁用用户'


    def enable_user(self,request,queryset):
        """批量启用用户"""
        queryset.update(is_active=True)

    enable_user.short_description = '批量启用用户'

五、在admin中使用富文本

在django项目中安装富文本扩展

django-ckeditor

django-ckeditor · PyPI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值