Django ==> ModelAdmin
1.数据表(models.py)的创建。
from django.db import models # Create your models here. class Role(models.Model): caption = models.CharField(max_length=32) class Meta: verbose_name_plural = '角色表' def __str__(self): return self.caption class UserType(models.Model): title = models.CharField(max_length=32) roles = models.ManyToManyField(to=Role) class Meta: verbose_name_plural = '类型表' def __str__(self): return self.title class Userinfo(models.Model): name = models.CharField(max_length=32) email = models.EmailField(max_length=32) ut = models.ForeignKey(to=UserType,null=True,blank=True) class Meta: verbose_name_plural = '用户表' def __str__(self): return self.name
2.admin.py里的定制
(1).list_display,列表时,定制显示的列。
class UserAdmin(admin.ModelAdmin):
list_display = ('name','email','ut','xxx')
def xxx(self,obj): #自定义 列
return "xxxx"
admin.site.register(models.Userinfo,UserAdmin)
(2).list_display_links,列表时,定制列可以点击跳转。
class UserAdmin(admin.ModelAdmin): list_display = ('name','email','ut','xxx') #以列表显示 list_display_links = ('name','ut',) #列表时,定制列可以点击跳转。 def xxx(self,obj): #自定义 列 return "xxxx" admin.site.register(models.Userinfo,UserAdmin)
(3).list_filter,列表时,定制右侧快速筛选。
class UserAdmin(admin.ModelAdmin): list_display = ('name','email','ut','xxx') #以列表显示 list_display_links = ('name','ut',) #列表时,定制列可以点击跳转。 list_filter = ('name', 'ut',) # 列表时,定制右侧快速筛选 def xxx(self,obj): #自定义 列 return "xxxx" admin.site.register(models.Userinfo,UserAdmin)
(4).分页相关
class UserAdmin(admin.ModelAdmin): list_display = ('name','email','ut','xxx') #以列表显示 list_display_links = ('name','ut',) #列表时,定制列可以点击跳转。 list_filter = ('name', 'ut',) # 列表时,定制右侧快速筛选 list_select_related=True#列表时,连表查询是否自动select_related list_per_page = 1 #分页,每页显示条数 list_max_show_all = 200 #分页,显示全部(真实数据<该值时,才会有显示全部) def xxx(self,obj): #自定义 列 return "xxxx" admin.site.register(models.Userinfo,UserAdmin)
(5).list_editable,列表时,可以编辑的列
class UserAdmin(admin.ModelAdmin): list_display = ('name','email','ut','xxx') #以列表显示 list_display_links = ('name',) #列表时,定制列可以点击跳转。 list_filter = ('name', 'ut',) # 列表时,定制右侧快速筛选 list_select_related=True#列表时,连表查询是否自动select_related list_per_page = 1 #分页,每页显示条数 list_max_show_all = 200 #分页,显示全部(真实数据<该值时,才会有显示全部) list_editable = ('ut',) #列表时,可以编辑的列 def xxx(self,obj): #自定义 列 return "xxxx" admin.site.register(models.Userinfo,UserAdmin)
(6).search_fields,列表时,模糊搜索的功能
class UserAdmin(admin.ModelAdmin): list_display = ('name','email','ut','xxx') #以列表显示 list_display_links = ('name',) #列表时,定制列可以点击跳转。 list_filter = ('name', 'ut',) # 列表时,定制右侧快速筛选 list_select_related=True#列表时,连表查询是否自动select_related list_per_page = 1 #分页,每页显示条数 list_max_show_all = 200 #分页,显示全部(真实数据<该值时,才会有显示全部) list_editable = ('ut',) #列表时,可以编辑的列 search_fields = ('name','email',) #模糊搜索功能 def xxx(self,obj): #自定义 列 return "xxxx" admin.site.register(models.Userinfo,UserAdmin)
(7).date_hierarchy,列表时,对Date和DateTime类型进行搜索
date_hierarchy = 'date'
(8).preserve_filters,详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件
(9).save_as = False,详细页面,按钮为“Sava as new” 或 “Sava and add another”
(10).list_select_related,列表时,连表查询是否自动select_related
(11).save_as_continue = True,点击保存并继续编辑
save_as_continue = True # 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。 # 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。 New in Django 1.10.
(12).save_on_top = False 详细页面,在页面上方是否也显示保存删除等按钮
(13).inlines,详细页面,如果有其他表和当前表做FK,那么详细页面可以进行动态增加和删除
class UserInforInline(admin.StackedInline): # Inline 类 extra = 0 model = models.Userinfo class UserType(admin.ModelAdmin): #类型表,主表 list_display = ('title',) inlines = [UserInforInline,] #绑定 Inline 类 admin.site.register(models.UserType,UserType)
(14).action 列表时 定制action中的操作
# 定制Action行为具体方法 def func(self, request, queryset): print(self, request, queryset) print(request.POST.getlist('_selected_action')) func.short_description = "中文显示自定义Actions" actions = [func, ] # Action选项都是在页面上方显示 actions_on_top = True # Action选项都是在页面下方显示 actions_on_bottom = False # 是否显示选择个数 actions_selection_counter = True
(15).定制HTML模板
add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None delete_selected_confirmation_template = None object_history_template = None
(16).raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式
raw_id_fields = ('ut',) # 详细页面 针对FK和M2M字段变成以Input框形式
(17).fields 详细页面时 显示字段的字段
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): fields = ('name',)
(18).exclude,详细页面时,排除的字段
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): exclude = ('name',)
(19).readonly_fields,详细页面时,只读字段
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): readonly_fields = ('name',)
(20).fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示.也可以理解未 分块
fieldsets = ( ('基本数据', { 'fields': ('name',) }), ('其他', { 'classes': ('collapse', 'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty' 'fields': ('email', 'ut'), }), )
(21).详细页面时 M2M显示时 数据移动选择(方向:上下和左右)
filter_vertical = ("roles",) # 或filter_horizontal = ("m2m字段",)
(22).ordering,列表时,数据排序规则
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): ordering = ('-id',) 或 def get_ordering(self, request): return ['-id', ]
(23).view_on_site,编辑时,是否在页面上显示view on set
view_on_site = False 或 def view_on_site(self, obj): return 'https://www.baidu.com'
(24). radio_fields,详细页面时,使用radio显示选项(FK默认使用select)
radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
1
(25).show_full_result_count = True,列表时,模糊搜索后面显示的数据个数样式
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): # show_full_result_count = True # 1 result (12 total) # show_full_result_count = False # 1 result (Show all) search_fields = ('user',)
(26).formfield_overrides = {},详细页面时,指定现实插件
from django.forms import widgets from django.utils.html import format_html class MyTextarea(widgets.Widget): def __init__(self, attrs=None): # Use slightly better defaults than HTML's 20x2 box default_attrs = {'cols': '40', 'rows': '10'} if attrs: default_attrs.update(attrs) super(MyTextarea, self).__init__(default_attrs) def render(self, name, value, attrs=None): if value is None: value = '' final_attrs = self.build_attrs(attrs, name=name) return format_html('<textarea {}> {}</textarea>',final_attrs, value) @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): formfield_overrides = { models.models.CharField: {'widget': MyTextarea}, }
(27).prepopulated_fields = {},添加页面,当在某字段填入值后,自动会将值填充到指定字段。
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): prepopulated_fields = {"email": ("user","pwd",)}
(28).form = ModelForm,用于定制用户请求时候表单验证
from app01 import models from django.forms import ModelForm from django.forms import fields class MyForm(ModelForm): others = fields.CharField() class Meta: model = models = models.UserInfo fields = "__all__" @admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): form = MyForm
(28).empty_value_display = "列数据为空时,显示默认值"
@admin.register(models.UserInfo) class UserAdmin(admin.ModelAdmin): empty_value_display = "列数据为空时,默认显示" list_display = ('user','pwd','up') def up(self,obj): return obj.user up.empty_value_display = "指定列数据为空时,默认显示"