Loading

Django的admin后台管理系统

Django的admin后台管理系统

(1)模型的数据管理

当我们定义好模型后,如果要使用Django自带的admin后台管理系统那么需要在每个项目应用的admin.py中定义每个模型的ModelAdmin,例如在项目应用account的admin.py中为自定义的用户模型MyUser定义它的ModelAdmin,代码如下:

from django.contrib import admin
from .models import MyUser
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _


@admin.register(MyUser)
class MyUserAdmin(UserAdmin):
    # 在模型的数据列表页设置显示的模型字段
    list_display = ['username', 'email',
                    'name', 'introduce',
                    'company', 'profession',
                    'address', 'telephone',
                    'wx', 'qq', 'wb', 'photo']
    # 将源码的UserAdmin.fieldsets 转换成列表格式
    fieldsets = list(UserAdmin.fieldsets)
    # 重写UserAdmin的fieldsets,将添加模型字段信息录入
    fieldsets[1] = (_('Personal info'),
                    {'fields': ('name', 'introduce',
                                'email', 'company',
                                'profession', 'address',
                                'telephone', 'wx',
                                'qq', 'wb', 'photo')})
	
    # 根据当前用户名设置数据访问权限,非必须配置项,根据需求而变
    def get_queryset(self, request):
        qs = super(MyUserAdmin, self).get_queryset(request)
        return qs.filter(id=request.user.id)

当然上面的配置比较特殊,因为是用户模型的数据管理,现在举一个普通模型的数据管理例子,如博客系统的article应用中的admin.py,代码如下:

from django.contrib import admin
from .models import *

admin.site.site_title = '博客管理后台'
admin.site.site_header = '博客管理'


@admin.register(ArticleTag)
class ArticleTagAdmin(admin.ModelAdmin):
    # 在模型的数据列表页设置显示的模型字段
    list_display = ['id', 'tag', 'user']

    # 根据当前用户名设置数据访问权限,非必须配置
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(user_id=request.user.id) # 只需根据需要修改相应的外键字段user_id即可

    # 新增或修改数据时,设置外键可选值,非必须配置
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'user':  # user是可变的
            id = request.user.id
            kwargs["queryset"] = MyUser.objects.filter(id=id) # 模型MyUser可变
        return super().formfield_for_foreignkey(db_field, request, **kwargs)


@admin.register(ArticleInfo)
class ArticleInfoAdmin(admin.ModelAdmin):
    # 在模型的数据列表页设置显示的模型字段
    list_display = ['author', 'title', 'content', 'articlephoto', 'created', 'updated']

    # 根据当前用户名设置数据访问权限
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(author_id=request.user.id) # 只需根据需要修改相应的外键字段author_id即可

    # 新增或修改数据时,设置外键可选值,非必须配置
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == 'article_tag':
            id = request.user.id
            kwargs["queryset"] = ArticleTag.objects.filter(user_id=id)
        return super().formfield_for_manytomany(db_field, request, **kwargs)

    # 新增或修改数据时,设置外键可选值,非必须配置
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'author': # author可变
            id = request.user.id
            kwargs["queryset"] = MyUser.objects.filter(id=id) # 模型MyUser可变
        return super().formfield_for_foreignkey(db_field, request, **kwargs)




@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    # 在模型的数据列表页设置显示的模型字段
    list_display = ['article', 'commentator', 'content', 'created']

    # 根据当前用户名设置数据访问权限,非必须配置
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(article__author__id=request.user.id) # 只需根据需要修改相应的外键字段article__author__id即可

    # 新增或修改数据时,设置外键可选值,非必须配置
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'article': # article可变
            id = request.user.id
            kwargs["queryset"] = Comment.objects.filter(article__author__id=id) # 模型Comment可变
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

(2)在每个项目应用的初始化文件 init.py中设置项目应用名称,项目应用的名称将显示在Admin后台系统地首页,代码如下:

from django.apps import AppConfig
import os
# 修改app在admin后台显示名称
# default_app_config的值来自apps.py的类名
default_app_config = 'account.IndexConfig' # account 为当前项目应用,需要改动

# 获取当前app的命名
def get_current_app_name(_file):
    return os.path.split(os.path.dirname(_file))[-1]

# 重写类IndexConfig
class IndexConfig(AppConfig):
    name = get_current_app_name(__file__)
    verbose_name = '用户管理' # 此处自定义名称

每个项目应用地代码都很相似,只需修改default_app_config和verbose_name

posted @ 2022-08-06 17:39  minqiliang  阅读(435)  评论(0编辑  收藏  举报
-->