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