Django(admin组件)
admin:就是一个APP,数据模型的增删改查组件等一系列功能
查:http://127.0.0.1:8080/admin/app01/表名
增:http://127.0.0.1:8080/admin/app01/表名/add/
改:http://127.0.0.1:8080/admin/app01/book/1change/
删:http://127.0.0.1:8080/admin/app01/book/1/delete
一、admin组件使用
Django 提供了基于 web 的管理工具。
Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它:
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'app02.apps.App02Config', ]
django.contrib是一套庞大的功能集,它是Django基本代码的组成部分。
二、激活管理工具
通常我们在生成项目时会在 urls.py 中自动设置好,
from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
当这一切都配置好后,Django管理工具就可以运行了。
三、使用管理工具
启动开发服务器,然后在浏览器中访问 http://127.0.0.1:8000/admin/,得到登陆界面,你可以通过命令 python manage.py createsuperuser 来创建超级用户。
为了让 admin 界面管理某个数据模型,我们需要先注册该数据模型到 admin
from django.db import models class Book(models.Model): title=models.CharField(max_length=32) price=models.DecimalField(max_digits=5,decimal_places=2) pub_date=models.DateField() publish=models.ForeignKey("Publish") authors=models.ManyToManyField("Author") def __str__(self): # 加上__str__是为了让在admin可视化视图显示对象名称 return self.title class Publish(models.Model): name=models.CharField(max_length=32) def __str__(self): return self.name class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() def __str__(self): return self.name
四、admin的定制
在admin.py中只需要讲Mode中的某个类注册,即可在Admin中实现增删改查的功能,如:
admin.site.register(models.UserInfo)
但是,这种方式比较简单,如果想要进行更多的定制操作,需要利用ModelAdmin进行操作,如:
方式一:
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd',)
admin.site.register(models.UserInfo, UserAdmin) # 第一个参数可以是列表
方式二:
@admin.register(models.UserInfo) # 第一个参数可以是列表
class UserAdmin(admin.ModelAdmin):
list_display = ('user', 'pwd',)
五、admin中的功能
这些功能都写在定义的这个类下:
class BookAdmin(admin.ModelAdmin):
1、list_display,在列表中可以显示该表下的所有字段,不能写关联字段
list_display=("title","price","publish","pub_date")

2、list_display_links,点击该列表也可以跳转
list_display_links=("price","title","publish")

3、list_filter,右侧快速筛选
list_filter=("title","price","publish")

4、list_edittable ,可以编辑的列
list_edittable=("price","publish")

5、search_fields,列表时,模糊搜索的功能
search_fields=("title","price")

6、date_hierarchy,列表时,对Date和DateTime类型进行搜索
date_hierarchy = "pub_date"

7、 定制Action行为具体方法,可以批量操作
def func(self, request, queryset):
print(self, request, queryset) # queryset就是选中的数据
print(request.POST.getlist('_selected_action')) # _selected_action就是选中的ID号
queryset.update(price=100)
func.short_description = "选中则修改价格为100" # action一栏中显示的内容
actions = [func, ]
# Action选项都是在页面上方显示
actions_on_top = False
# Action选项都是在页面下方显示
actions_on_bottom = True
# 是否显示选择个数
actions_selection_counter = True

8、可以设置自己的HTML,可以不用admin自带的
change_list_template="my_change_list.html"
9、inlines,详细页面,如果有其他表和当前表做FK(关联),那么详细页面可以进行动态增加和删除
class BookInline(admin.StackedInline):
extra = 0
model = Book
class PublishAdmin(admin.ModelAdmin):
list_display=("name",) # 点击表名就是(添加)详情页
inlines =[BookInline,]
详细页面就是要操作的那个页面,这个详细页面是放在关联表关系是一的那张表
10、 fieldsets,详细页面时,使用fieldsets标签对数据进行分割显示
fieldsets = (
('基本数据', {
'fields': ('title',)
}),
('其他', { # 下图的分割线上是基本数据,线下的是其他
'classes': ("collapse",'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty'
'fields': ('price', 'publish'),
}),
)
![]()
11、ordering,列表时,数据排序规则,默认都是id
ordering = ('-price',"id") # 排序,可以同时排序,先按价格,价格一样再按id,加个(-)就是从高到底
12、可以自定义规则,在里表里加上编辑
from django.utils.safestring import mark_safe # 在模板里面可以用过滤器safe进行一个安全校验,在Python脚本里就得引用这个mark_safe,不然就是把标签当成一个文本
class BookAdmin(admin.ModelAdmin):
list_display=("title","price","publish","pub_date","edit")
def edit(self,obj): # obj:就是每一个book的对象
return mark_safe("<a href='%s/change/'>编辑</a>"%obj.id) # 返回一个可点击的a标签
admin.site.register(Book,BookAdmin)
from django.contrib import admin
# Register your models here.
from .models import *
from django.utils.safestring import mark_safe
from django.forms import ModelForm
from django import forms
class MyForm(ModelForm):
# 可以添加自己的modelform,加vigist组件
class Meta:
model = Book # 给book定制一个form表单
fields = "__all__" # 所有的字段
class BookAdmin(admin.ModelAdmin):
list_display=("title","price","publish","pub_date","edit") # 在列表中可以显示该表下的所有字段,关联字段不能显示
# list_display_links=("price","title","publish") # 点击该列表也可以跳转
# list_filter=("title","price","publish") # 右侧快速筛选
list_editable=("price","publish")
search_fields=("title","price")
date_hierarchy="pub_date"
# 定制Action行为具体方法,可以批量操作
def func(self, request, queryset):
print(self, request, queryset)
print(request.POST.getlist('_selected_action'))
queryset.update(price=100)
func.short_description = "选中则修改价格为100" # action一栏中显示额内容
actions = [func, ]
# Action选项都是在页面上方显示
actions_on_top = False
# Action选项都是在页面下方显示
actions_on_bottom = True
# 是否显示选择个数
actions_selection_counter = True
change_list_template="my_change_list.html" # 可以设置自己的html,优先使用自己的
# fields = ("title","price") # 详细页面显示的字段
fieldsets = (
('基本数据', {
'fields': ('title',)
}),
('其他', {
'classes': ("collapse",'wide', 'extrapretty'), # 'collapse','wide', 'extrapretty'
'fields': ('price', 'publish'),
}),
)
ordering = ('-price',"id") # 排序,可以同时排序,先按价格,价格一样再按id,-按高到底排序
form = MyForm
def edit(self,obj):
return mark_safe("<a href='%s/change/'>编辑</a>"%obj.id) # 返回一个可点击的a标签
class BookInline(admin.StackedInline):
extra = 0
model = Book
class PublishAdmin(admin.ModelAdmin):
list_display=("name",)
inlines =[BookInline,]
admin.site.register(Book,BookAdmin)
admin.site.register(Publish,PublishAdmin)
admin.site.register(Author)
ps:不常用的一些功能
list_select_related,列表时,连表查询是否自动select_related
定制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
raw_id_fields,详细页面,针对FK和M2M字段变成以Input框形式
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
raw_id_fields = ('FK字段', 'M2M字段',)
fields,详细页面时,显示字段的字段
fields = ("title","price")
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
fields = ('user',)
加了fields
没加fields

exclude,详细页面时,排除的字段
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
exclude = ('user',)
readonly_fields,详细页面时,只读字段
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
readonly_fields = ('user',)
详细页面时,M2M显示时,数据移动选择(方向:上下和左右)
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
filter_vertical = ("m2m字段",) # 或filter_horizontal = ("m2m字段",)
ordering,列表时,数据排序规则
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
ordering = ('-id',)
或
def get_ordering(self, request):
return ['-id', ]
radio_fields,详细页面时,使用radio显示选项(FK默认使用select)
radio_fields = {"ug": admin.VERTICAL} # 或admin.HORIZONTAL
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 # 自己可以定制
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 = "指定列数据为空时,默认显示"



浙公网安备 33010602011771号