Django Admin之常用功能汇总
1.字段支持下拉搜索框
1)在admin中新增字段autocomplete_fields
autocomplete_fields = ("field1","field2") 注意:field1,field2字段需要的是外键字段
2)field1,field2字段需要在model中添加类属性search_fields
search_fields = ('name', ) 注意:name为field1或field2对应表中要进行搜索的字段
2.字段支持自定义颜色选择器

1)安装python扩展
pip install django-colorfield
生成静态文件
python manage.py collectstatic
2) 配置文件settings.py , 添加配置项
在INSTALLED_APPS中添加 INSTALLED_APPS = [ ... 'colorfield', ... ]

3) 在model.py中添加字段支持
from django.db import models from colorfield.fields import ColorField class ComputerRoom(models.Model): name = models.CharField(max_length=256,verbose_name = "名称") abbr = models.CharField(max_length=128, blank=True, null=True,verbose_name = "缩写") type = models.CharField(max_length=256,verbose_name='类型', choices=typeChoices) color = ColorField(default='#FF0000',verbose_name='显示颜色')
然后在Django后台打开对应的模块就可以看到颜色选择器了。
3.自定义菜单
左侧可折叠菜单是Simple UI系统默认菜单,根据已注册的应用和模型自动生成,其中父级菜单是App名,子菜单一般是所属App的各个模型名。SimpleUI甚至会自动为你分配默认图标,比如本例的tasks的应用使用了font-awsome的fa fa-tasks。在大多数情况下,Simple UI系统默认菜单不能满足需求,这时你就需要自定义菜单了,比如添加新的选项或给菜单选项分配新的图标。
修改settings.py, 添加如下代码:
SIMPLEUI_CONFIG = { # 是否使用系统默认菜单,自定义菜单时建议关闭。 'system_keep': False, # 用于菜单排序和过滤, 不填此字段为默认排序和全部显示。空列表[] 为全部不显示. 'menu_display': ['任务管理', '权限认证'], # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时刷新展示菜单内容。 # 一般建议关闭。 'dynamic': False, 'menus': [ { 'app': 'auth', 'name': '权限认证', 'icon': 'fas fa-user-shield', 'models': [ { 'name': '用户列表', 'icon': 'fa fa-user', 'url': 'auth/user/' }, { 'name': '用户组', 'icon': 'fa fa-th-list', 'url': 'auth/group/' } ] }, { 'name': '任务管理', 'icon': 'fa fa-th-list', 'models': [ { 'name': '任务列表', # 注意url按'/admin/应用名/模型名小写/'命名。 'url': '/admin/tasks/task/', 'icon': 'fa fa-tasks' }, ] }, ] }
自定义菜单效果如下所示。我们更改了SimpleUI默认分配的图标。你还可以随意增减菜单选项并对其进行排序:

查找相关图标:https://fontawesome.com/v5.15/icons?d=gallery&p=2
4.
一般测试环境会使用migrate来添加新的字段或者表, 但是线上一般不会使用命令直接操作,以防引起不可预知的问题, 这个时候就可以手动的将测试服的相关表变更同步到生产环境
尤其是使用的admin后台的时候, 依赖他本身的权限管理这一套, 涉及表:
django_content_type: 添加对应app_label和model记录
auth_permission: 添加对应操作项(Can add xxx,Can change xxx, Can delete xxx, Can view xxx)
5. 禁用编辑链接和添加,修改, 删除操作
在admin.py文件的具体类中 class MyModelAdmin(models.ModelAdmin): ... List_display_links = None #禁用编辑链接 def has_add_permission(self, request): # 禁用添加按钮 return False def has_delete_permission(self, request, obj=None): # 禁用删除按钮 return False def has_change_permission(self, request, obj=None): # 禁用修改按钮 return False def get_actions(self, request): # 在actions中去掉‘删除’操作 actions = super(GradesManagementAdmin, self).get_actions(request) if request.user.username[0].upper() != 'J': if 'delete_selected' in actions: del actions['delete_selected'] return actions
需要注意的是,这种禁用编辑链接的放法只是不让它在页面中显示,即把超链接去掉了,但是还是可以通过手动输入url的方式来进入编辑页面。不过可以配合设置fieldsets或者readonly_fieldss来达到目的。
6.常用设置项
1)展示模型字段
list_display= ('id', 'uid',)

2)设置隐藏信息
fieldsets = () fieldsets = ( ('职业信息', {'fields': ('job','title',)}), ('人员信息', { 'classes': ('collapse',), 'fields':('person',), }) )

3)将下拉框改成单选按钮
admin.HORIZONTAL 水平排列 admin.VERTICAL 垂直排列 radio_fields = ('person': admin.HORIZONTAL)


4).设置不可编辑字段
readonly_fields = [] readonly_fields = ['job']
5).设置升降序
ordering = [] ordering = ['id'] 默认是升序,降序为 ordering = ['-id']

6).设置字段可以排序显示 sortable_by = []
sortable_by = ['job','title']

7).为字段设置路由地址,点击即进入修改页面 list_display_links=[]
list_display_links = ['id','job']

8)设置过滤器 list_filter = []
list_filter = ['job','title']

9)设置每一个的数量
设置每一页的数据量 list_per_page = 100 设置每一个的最大数据量 list_max_show_all = 200
10)设置字段可编辑 list_editable =[]
list_editable = ['title']

11)设置可搜索字段search_fields=[]
search_fields = ['job']

12)修改/admin页面的index的title
在APP文件下的__init__.py


13)修改中文字段中多处的‘s’
models.py中添加verbose_name_plural

14)后台文字描述修改
后台网页title修改 APP下的urls.py 最后添加
admin.site.site_title = '后台标题' admin.site.site_header = '后台头部'
admin.site.index_title = '后台首页标题'


7, 文件上传并支持将docx文档内容转化为HTML
配置文件添加媒体路径:
MEDIA_ROOT = os.path.join(BASE_DIR, "uploads")
目录结构:

models.py
from django.db import models from django.core import validators from tinymce.models import HTMLField from colorfield.fields import ColorField class UserAgreement(models.Model): AGREE_TYPES = ( (1, '收集个人信息'), (2, '共享个人信息'), (3, '隐私协议'), (4, '服务协议'), ) appid = models.ForeignKey(Game, db_column='appid', null=True, default=0, on_delete=models.SET_NULL, verbose_name='游戏') type = models.IntegerField(default=0, choices=AGREE_TYPES, blank=True, verbose_name='类型') content = HTMLField('内容') background_color = ColorField(max_length=32, null=True, default='#fef9db', verbose_name='背景色') upload_file = models.FileField(upload_to='', null=False, default='', validators=[ validators.FileExtensionValidator(['docx', 'doc', 'pdf'], message='请上传正确格式的文件') ], verbose_name='上传文件', help_text='支持上传的文件格式:pdf,doc,docx') search_fields = ('appid',) def __str__(self): return self.content class Meta: db_table = "user_agreement" verbose_name = verbose_name_plural = "用户相关协议表"
安装docx转换HTML包pydocx
pip install pydocx
admin.php 文件
from django.contrib import admin from .models import * @admin.register(UserAgreement) class UserAgreementAdmin(admin.ModelAdmin): list_display = ('appid', 'type', 'content', 'background_color') list_filter = ('appid',) list_per_page = 10 autocomplete_fields = ('appid', ) def save_model(self, request, obj, form, change): file = request.FILES.get('upload_file') if file: html = PyDocX.to_html(file) obj.content = html cache_key = RedisKey.USER_AGREEMENT.format(obj.appid_id, obj.type) delete_cache(cache_key) super().save_model(request, obj, form, change)
展示效果:

参考:Django实战: 手把手教你配置Django SimpleUI打造美丽后台(多图) - 知乎 (zhihu.com)

浙公网安备 33010602011771号