Django学习笔记二十三——Django之admin模块的使用

我们在前面有一章讲了怎么通过admin页面操作数据库(点击查看),这里我们看一看admin模块一些常用的使用方法。

数据库代码

为了更好的演示admin模块的使用,创建一个这样的数据结构,(其实就是前面讲的图书管理系统)

 1 from django.db import models
 2 
 3 # Create your models here.
 4 class Publisher(models.Model):
 5     id = models.AutoField(primary_key=True)
 6     name = models.CharField(null = False,max_length=16)
 7 
 8     def __str__(self):
 9         return self.name
10         
11 class 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 
16     def __str__(self):
17         return self.title
18 
19 class 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 
24     def __str__(self):
25         return '<Author Object:{}>'.format(self.name)
models代码

三个表,一个书籍,一个作者一个出版社,在前面那章讲过,如果要使用这个admin组件,就要在admin.py这个文件中对models进行注册

from django.contrib import admin

# Register your models here.

from . import models
admin.site.register(models.Books)
admin.site.register(models.Publisher)

这样就可以在admin下查看数据库了

admin中的URL

 在http://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

但是我们可以通过下面的代码来定义,要求按照字段的形式来显示

1 class Book_Config(admin.ModelAdmin):
2     list_display = ['title','publisher',]
3 admin.site.register(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标签的方式显示字段

1 class 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的标签来显示一个字段的内容

1 class 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控件的使用

在默认的状态下页面上有个下来框,里面只包含了一个行为——删除所有被选中的数据。但是这个操作是可以自定义的。

 1 class Book_Config(admin.ModelAdmin):
 2 
 3     list_display = ['title','price','publisher',]
 4 
 5     #自定义函数
 6     def 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文件,不过这个好像没什么用,毕竟原有的模板已经写的很完善了。

详细页面中的字段显示

在默认情况下,在详情页面中是显示出所有的字段的

 但是有些数据是不需要用户去填写的,就可以自己定义显示哪些字段

1 class Book_Config(admin.ModelAdmin):
2 
3     fields = ['title']

这样就只显示出一个title字段

 要注意的是不能为空的字段不能被隐藏(或者该字段带有默认值),否则在添加数据的时候会报错。

原文地址:https://www.cnblogs.com/yinsedeyinse/p/13201308.html