文章目录
激活管理工具
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 = '将性别改为 男'
- 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):
# ...