Django学习笔记⼆⼗三——Django之admin模块的使⽤我们在前⾯有⼀章讲了怎么通过admin页⾯操作数据库(),这⾥我们看⼀看admin模块⼀些常⽤的使⽤⽅法。
数据库代码
为了更好的演⽰admin模块的使⽤,创建⼀个这样的数据结构,(其实就是前⾯讲的图书管理系统)
1from django.db import models
2
3# Create your models here.
4class Publisher(models.Model):
5    id = models.AutoField(primary_key=True)
6    name = models.CharField(null = False,max_length=16)
7
8def__str__(self):
9return self.name
10
11class Books(models.Model):
12    id = models.AutoField(primary_key=True)
13    title = models.CharField(null=False,max_length=32)
14    publisher = models.ForeignKey(to='Publisher',on_delete=models.CASCADE)      #这⾥在创建的时候ORM会直接把外键的名字设置为publisher_id
15
16def__str__(self):
17return self.title
18
19class Author(models.Model):
20    id = models.AutoField(primary_key=True)
21    name = models.CharField(null=False,max_length=10,unique=True)
22    book = models.ManyToManyField(to='Books')          #⽤了多对多的关联
23
24def__str__(self):
25return'<Author Object:{}>'.format(self.name)
models代码
三个表,⼀个书籍,⼀个作者⼀个出版社,在前⾯那章讲过,如果要使⽤这个admin组件,就要在admin.py这个⽂件中对models进⾏注册
ib import admin
# Register your models here.
from . import models
ister(models.Books)
ister(models.Publisher)
这样就可以在admin下查看数据库了
django怎么学admin中的URL
在127.0.0.1:8000/admin/这个路径下我们可以对各个表进⾏⼀下操作,可以发现常规的增删改查操作对应的URL是有⼀定关系的查看table——admin/appname/tablename/
向table⾥添加数据——admin/appname/tablename/add/
编辑——admin/appname/tablename/pk/change/(pk为主键id)
删除——admin/appname/tablename/pk/delete/
发现了这些规律,我们可以在⾃定义admin模块的时候通过这些url创建⼀些新的a标签来实现⼀些其他的功能。
admin的⾃定义参数
我们在前⾯直接注册的时候是⽤的默认的配置,其实我们还可以通过定义⼀个新的类来⾃定义页⾯的显⽰效果
我们先看⼀下默认的显⽰效果是什么样的
在这个table⾥显⽰的数据是按照对象的⽅式来显⽰的,显⽰的内容是我们在定义models⾥通过最后下⾯的代码的
def__str__(self):
return self.nam
返回值。
按照字段显⽰table
但是我们可以通过下⾯的代码来定义,要求按照字段的形式来显⽰
1class Book_Config(admin.ModelAdmin):
2    list_display = ['title','publisher',]
3 ister(models.Books,Book_Config)
第三⾏的注册在后⾯演⽰的过程就不再写了,主要就是看Book_Config的不同参数的不同效果
看看⽤上⾯的⽅式定义的显⽰效果
这样就是按照字段⾥的内容来显⽰数据了。但是要注意,这个list_display⾥不能放ManytoManyField字段的数据。如果要使⽤的话要后⾯有专门讲的⽅法。
临时添加的字段
list_display的列表⾥还可以直接引⽤⼀个函数来显⽰⼀个指定的标签,⽐⽅我们想在每⾏数据后添加⼀个删除的按钮,就可以定义⼀个函数,然后把这个函数名加载到列表⾥(是函数名,不⽤加括号)
class Book_Config(admin.ModelAdmin):
def delete_item(self):
from django.utils.safestring import mark_safe
return mark_safe("<a href='//'>删除</a>")
list_display = ['title','publisher',delete_item]
list_display_links = ['publisher']
这样就会在表格⾥新加⼀个删除列
a标签⾥的href属性是怎么赋值,我们⼀会再说!
按照a标签的⽅式显⽰字段
1class Book_Config(admin.ModelAdmin):
2    list_display = ['title','publisher']
3    list_display_links = ['publisher']
这样,publisher字段就不光是⼀个展⽰的效果了⽽是⼀个可以点击的a标签,点击后会转到对这个对象进⾏修改的页⾯,但是要注意的是在指定链接显⽰的时候必须在
list_display中有这个字段。具体的效果图就不截了,和上⾯的差不多。
定制筛选列表
我们可以利⽤admin⾃带的筛选器来做⼀个筛选器列表
class Book_Config(admin.ModelAdmin):
list_filter = ['publisher',]
这样就会在页⾯的右侧新展⽰出来⼀个列表选项
并且可以点击分类来筛选需要的数据。
列可编辑
可以⽤input的标签来显⽰⼀个字段的内容
1class Book_Config(admin.ModelAdmin):
2
3    list_display = ['title','publisher']
4    list_display_links = ['publisher']
5    list_editable = ['title']
但是有个问题不知到是bug还是怎么的,在设置list_editable的时候,list_display_links⼀定要有参数设置,否则会⼀致报错,出来的效果如下
按字段搜索
class Book_Config(admin.ModelAdmin):
list_display = ['title','publisher',]
list_display_links = ['publisher',]
search_fields = ['title','publisher',]
这⾥的搜索是⼀个模糊搜索,只要指定的字段内有包含的值都会被索引出来
就是上⾯的search控件
action控件的使⽤
在默认的状态下页⾯上有个下来框,⾥⾯只包含了⼀个⾏为——删除所有被选中的数据。但是这个操作是可以⾃定义的。
1class Book_Config(admin.ModelAdmin):
2
3    list_display = ['title','price','publisher',]
4
5#⾃定义函数
6def patch_init(self,request,queryset):
7        queryset.update(price = 0)
8#定义action在下拉表中显⽰的名称
9    patch_init.short_description = '价格初始化'
10#导⼊下拉菜单
11    actions = [patch_init,]
这样就可以对选中的数据进⾏批量操作了。
定制HTML模板
admin模块可以使⽤⾃⼰写的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
为None的时候就是说我们没有⽤⾃⼰的模板,可以直接指定⼀个HTML⽂件,不过这个好像没什么⽤,毕竟原有的模板已经写的很完善了。详细页⾯中的字段显⽰
在默认情况下,在详情页⾯中是显⽰出所有的字段的
但是有些数据是不需要⽤户去填写的,就可以⾃⼰定义显⽰哪些字段
1class Book_Config(admin.ModelAdmin):
2
3    fields = ['title']
这样就只显⽰出⼀个title字段
要注意的是不能为空的字段不能被隐藏(或者该字段带有默认值),否则在添加数据的时候会报错。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。