第九章——Admin 后台系统
pip3 install django-simpleui
Simple UI 文档
simpleui几个常用设置, 文档中都有介绍
SIMPLEUI_DEFAULT_THEME = 'simpleui.css'
SIMPLEUI_ANALYSIS = False
SIMPLEUI_HOME_PAGE = 'https://www.baidu.com'
SIMPLEUI_HOME_TITLE = '百度一下你就知道'
SIMPLEUI_HOME_ICON = 'fa fa-user'
SIMPLEUI_INDEX = 'https://www.88cto.com'
SIMPLEUI_LOGO = 'https://avatars2.githubusercontent.com/u/13655483?s=60&v=4'
SIMPLEUI_HOME_INFO = False
SIMPLEUI_HOME_QUICK = True
SIMPLEUI_HOME_ACTION = False
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
fieldsets = (
(
'职业信息', {
'fields': ('job', 'title', 'payment')
}
),
(
'人员信息', {
'classes': ('collapse',),
'fields': ('person',)
}
),
)
radio_fields = {'person': admin.HORIZONTAL}
ordering = ['id']
sortable_by = ['job', 'title']
list_display = ['id', 'job', 'title', 'payment', 'person']
list_filter = ['job', 'title', 'person__name']
list_per_page = 20
list_max_show_all = 200
list_editable = ['job', 'title']
search_fields = ['job']
date_hierarchy = 'recordTime'
save_as = True
actions_on_top = True
actions_on_bottom = True
admin.site.site_title = 'MyDjango后台管理'
admin.site.site_header = 'MyDjango'
第一步:修改apps.py文件,在name所在行下方增加
verbose_name = "学习笔记"
第二步:修改__init__.py文件,添加以下内容:
default_app_config = "note_wx.apps.NoteWxConfig"
Admin后台二次开发
设置只读属性
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
if request.user.is_superuser:
self.readonly_fields = []
else:
self.readonly_fields = ['payment']
return self.readonly_fields
设置字段样式
from django.utils.html import format_html
class Vocation(models.Model):
JOB = (
('软件开发', '软件开发'),
('软件测试', '软件测试'),
('需求分析', '需求分析'),
('项目管理', '项目管理'),
)
job = models.CharField(max_length=20, choices=JOB)
title = models.CharField(max_length=20)
payment = models.IntegerField(null=True, blank=True)
person = models.ForeignKey(PersonInfo, on_delete=models.CASCADE)
recordTime = models.DateField(auto_now=True, null=True, blank=True)
def __str__(self):
return self.job
class Meta:
verbose_name = '职业信息'
verbose_name_plural = '职业信息'
def colored_name(self):
if 'cooper' in self.person.name:
color_code = 'red'
else:
color_code = 'blue'
return format_html(
'<span style="color: {};">{}</span>',
color_code,
self.person.name
)
colored_name.short_description = '带颜色的姓名'
list_display = ['id', 'job', 'title', 'payment', 'person', 'colored_name']
函数 get_queryset(self, request)
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(id__lt=2)
函数formfield_for_foreignkey,外键增加下拉框
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'person':
if not request.user.is_superuser:
v = Vocation.objects.filter(id__lt=3)
kwargs['queryset'] = PersonInfo.objects.filter(id__in=v)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
函数formfield_for_choice_field(模型字段设置了choices选项)
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
def formfield_for_choice_field(self, db_field, request, **kwargs):
if db_field.name == 'job':
kwargs['choices'] = (
('软件开发', '软件开发'),
('软件测试', '软件测试'),)
return super().formfield_for_choice_field(db_field, request, **kwargs)
函数save_model
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if change:
user = request.user.username
job = self.model.objects.get(pk=obj.pk).job
person = form.clean_data['person'].name
f = open('log.txt', 'a')
f.write(person + '职位: ' + job + ', 被 ' + user + '修改' + '\r\n')
f.close()
else:
pass
super().save_model(request, obj, form, change)
数据批量操作
@admin.register(Vocation)
class VocationAdmin(admin.ModelAdmin):
def get_data(self, request, queryset):
temp = []
for d in queryset:
t = [d.job, d.title, str(d.payment), d.person.name]
temp.append(t)
f = open('data.txt', 'a')
for t in temp:
f.write(', '.join(t) + '\r\n')
f.close()
self.message_user(request, '数据导出成功')
get_data.short_description = '导出所选数据'
actions = [get_data]