Django小记 后台-Admin模块


文章目录

  • 激活管理工具
  • 创建超级用户
  • make_password | check_password
  • 属性
  • 常用方法
  • 模型注册到Admin
    • admin.site.register(Student, StudentAdmin)
    • @admin.site.register(Student)


激活管理工具

urls.py

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
]

创建超级用户

python manage.py createsuperuser
# 接下来按照提示就可以完成创建

make_password | check_password

  • 自带的加密方法
  • make_password(text):加密
  • check_password(text, password) :验证密码
django.contrib.auth.hasher import make_password,check_password
  • authenticate
  • 授权验证
from django.contrib.auth import authenticate
# 授权成功返回user,否则返回None
user = authenticate(request,username=None,password=None)

属性

  • save_as
  • 在表单上启用“另存为”功能(默认False)
  • 在编辑页面将”保存并添加另一个“ 更改为“保存成新的”
save_as = True

  • save_as_continue
  • 点击保存为新的后是否跳转
  • 默认重定向是该对象的编辑视图
  • 如果设置了 save_as_continue=False,重定向将转到编辑列表视图。(默认True)

  • save_on_top
  • 在表单顶部添加保存按钮(默认False)

  • fields
  • 定义要显示的字段
  • 可以通过元组的方式让一些字段显示在同一行
fields = ('name', ('gender', 'age'))
  • fieldsets
  • 分组显示或者布局
  • 二元元组 ((block_name, {key : (val1, val2,…)}),…)
    • 第一个参数为名称
    • key 有两个常用取值:
      • fields :必填字段
      • classes:可取 collaspe(折叠)、wide(更宽)
    • val_ 为该板块要显示的字段
fieldsets = (('内容1', {
     'fields': ('A', 'B'),
                      'classes': ('wide',)}),
             ('内容2', {
     'fields': ('C',),
                      'classes': ('collapse',),
                      'description': '这是额外的描述信息'}))

  • list_display
  • 指定显示在列表页面上的字段
  • 内容可以是:模型字段、函数、ModelAdmin属性、模型的属性
list_display = ('student_num', 'name', 'class_name')

  • lsit_per_page
  • 控制每个分页的列表页面上显示数据量(默认100)
  • 设置后 list_max_show_all 有影响

  • list_max_show_all
  • 控制列表页面上 显示全部 可以显示多少条数据(默认200)

  • list_filter
  • 右侧快速筛选栏栏显示对象
  • 必须是一个元组
  • 元素可以为字段、django.contrib.admin.SimpleListFilter

  • list_display_links
  • 指定用于链接修改页面的字段

  • list_editable
  • 指定可编辑字段

  • list_select_related
  • 列表时,连表查询是否自动 select_related
  • 在列表页面上检索对象列表时使用
  • True:始终调用select_realted
  • False:查看list_display并调用select_related()(如果存在任何ForeignKey)
  • 如果需要更精细的控制,应使用元组或列表作为 list_select_related 的值。元素将直接传递给 select_related()作为参数

  • filter_horizontal | filter_vertical
  • 水平(垂直)显示过滤器
  • 用于多对多过滤器

  • radio_fields
  • 将外键或choice 字段由下拉框变成单选框
radio_fields = {
     "A": admin.VERTICAL}
radio_fields = {
     "A": admin.HORIZONTAL}

  • search_fields
  • 指定可以搜索的字段
  • 列表时,模糊搜索功能

  • show_full_result_count
  • 控制是否应在过滤的页面上显示对象的全部数量(默认True)
  • True显示为“总共”多少; False显示为“显示全部”

  • exclude
  • 详细页面时,排除的字段

  • form
  • 用于定制用户请求

  • action
  • 给列表页面提供额外的操作功能

student / models.py

from django.db import models
class Student(models.Model):
	name = ...
	gender = ...

student / admin.py

from student.models import Student
from django.contrib import admin

def change_gender_male(modeladmin, request, querset):
	queryset.update(gender='male')
change_gender_male.short_discription = '将性别改为 男'

class StudentAdmin(admin.ModelAdmin):
	actions = (change_gender_male,)
	list_display = ['name', 'gender', ...]
	# ...

或者

from student.models import Student
from django.contrib import admin

class StudentAdmin(admin.ModelAdmin):
	actions = (change_gender_male,)
	list_display = ['name', 'gender', ...]
	# ...

	def change_gender_male(self, request, querset):
		queryset.update(gender='male')
	change_gender_male.short_discription = '将性别改为 男'

Django小记 后台-Admin模块_第1张图片


  • actions_on_top | actions_on_bottom
  • 控制操作栏在页面上显示的位置

  • actions_selection_counter
  • 控制选择计数器是否显示在操作下拉列表旁边

  • readonly_fields
  • 指定只读字段

  • ordering
  • 列表时,数据排序规则
ordering = ('-id',)

  • sortable_by
  • 允许的字段参与排序
  • 只让其元组内的字段参与排序 ,其余字段将不可进行排序
sortable_by = ('name', )

  • date_hierarchy
  • 列表时,对Date和DateTime类型进行搜索。

  • inlines
  • 详细页面【模型内嵌】
  • 如果有其他表和当前表做ForeignKey,那么详细页面可以进行动态增加和删除。
class StudentAdmin(admin.ModelAdmin):
	# ...
	inlines = [ScoreAdmin,]

  • empty_value_display
  • 列数据为空时,显示默认值
from django.contrib import admin
from student.models import Student
@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    empty_value_display = "列数据为空时,默认显示"
 
    list_display = ('name','gender','doit')
 
    def doit(self,obj):
        return obj.user
    doit.empty_value_display = "指定列数据为空时,默认显示"

  • view_on_site
  • 控制是否显示“在站点上查看”按钮是否显示(默认True)
    当在模型中有get_absolute_url() 方法,则在修改页面显示 在站点上查看,可以通过将view_on_site 设置为False 不显示此按钮

常用方法

  • save_model()
  • 用于django的model保存或者修改时带入个人逻辑而可以重载的方法
  • obj:父对象在编写内容
  • change:当前执行的状态,二次保存时修改数据为True
  • form:父对象 HTML 源码
  • formsets:内联对象 HTML 源码
  • instance:内联对象 obj
def save_model(self,request,form,formsets,change):
	# ....

  • 例如写文章时,需要后天自动添加作者
from django.contrib import admin
 
class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.author = request.user
        super().save_model(request, obj, form, change)

  • delete_model()
  • 删除站点上的数据,添加自定义行为
  • 例如:
  • 删除单个学生对象,同时删除对应的 user 表中数据
class StudentAdmin(admin.ModelAdmin):
	# ...
	def delete_model(self,request,obj):
		super().delete_model(request,obj)
		if obj.user:
			obj.user.delete()

  • delete_queryset()
  • 删除多个数据,添加自定义行为
  • 例如:
  • 删除多个学生对象时,同时删除 user 表中数据
class StudentAdmin(admin.Model):
	# ...
	def delete_queryset(self,request,queryset):
		for obj in queryset:
			obj.user.delete()
			super().delete_model(request,obj)
		return

  • get_queryset()
  • Django 的 admin 默认会展示所有对象
  • 可以重写 get_queryset 方法,控制所获取的对象
  • 例如:
  • 超级用户则展示所有文章,普通用户仅展示自己所发表文章
class ArticleAdmin(admin.ModelAdmin):
	def get_queryset(self, request):
		queryset = super().get_queryset(request)
		if request.user.is_superuser:
			return queryset
		return queryset.filter(author=request.user)

模型注册到Admin

admin.site.register(Student, StudentAdmin)

from django.contrib import admin
from student.models import Student

class StudentAdmin(admin.ModelAdmin):
	# ....

admin.site.register(Student, StudentAdmin)

@admin.site.register(Student)

from django.contrib import admin
from student.models import Student

@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
	# ...

你可能感兴趣的