admin一开始接触时觉得挺神奇的,这大半年前前后后的复习过两次,不过都是写在了笔记本上,这次终于决定照着笔记再做一遍
废话不说直接仍代码
model.py
from django.db import models
from django.utils.safestring import mark_safe
class Publishes(models.Model):
name = models.CharField(max_length=32, verbose_name='出版社名')
class Meta:
verbose_name_plural = "出版社"
def __str__(self):
return self.name
class Authors(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
age = models.PositiveSmallIntegerField(verbose_name='年龄')
sex = models.IntegerField(choices=((0, '女'), (1, '男'), ), verbose_name='性别')
class Meta:
verbose_name_plural = "作者"
def __str__(self):
return self.name
class Books(models.Model):
nid = models.AutoField(primary_key=True, )
title = models.CharField(max_length=32, verbose_name="书名")
date = models.DateField(verbose_name="出版日期")
price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="价格")
publish = models.ForeignKey(to=Publishes, on_delete=models.CASCADE, verbose_name="出版社")
author = models.ManyToManyField(to="Authors")
# admin自定义字段,
def 价格(self):
if self.price > 500:
return mark_safe(('<span style="color: red;">{}</span>').format(self.price))
return mark_safe(('<span style="color: green;">{}</span>').format(self.price))
def __str__(self):
return self.title
# admin主页显示书籍, 否则显示Books
class Meta:
verbose_name_plural = "书籍"
admin.py
from django.contrib import admin
from app import models
class BookAdmin(admin.ModelAdmin):
# 根据当前登陆用户限制显示内容
def get_queryset(self, request):
qs = super(BookAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(price=888)
# 显示多对多字段, 默认不显示
def 作者(self, object):
return [a.name for a in object.author.all()]
# 自定义字段。 object是当前的model, 这里是book
def 自定义字段(self, object):
return object.publish.name
# 批量操作
def path_init(self, request, queryset):
queryset.update(price=888)
path_init.short_description = '修改价格到888'
# 指定描述
actions = [path_init]
# 加到action中
# 自定义title和header
admin.site.site_header = '自定义页面标题'
admin.site.site_title = '自定义Tab'
list_display = ('title', 'price', '价格', 'date', 'publish', '作者', '自定义字段')
# 要显示的字段
list_display_links = ['title', 'price']
# 点那个进入编辑页面
list_editable = ('date',)
# 直接可编辑, 当然和上面的点击进入编辑冲突
list_per_page = 4
# 显示分页
list_filter = ('author__sex', 'publish', 'price')
# 右边生成一个过滤器, 最好填入一对多和多对多字段, 增加效率, 还可以外键__字段,跨字段
filter_horizontal = ('author',)
# 必须是多对多字段,编辑时候,对于多对多字段操作更容易,有图
date_hierarchy = 'date'
# 主页是个字符串, 出现个按时间筛选的标签, 必须是时间对象
search_fields = ('title', 'price', 'date')
# 按字段查找搜索框, 不支持多对多,一对多
ordering = ('price',)
# 排序, 加-是降序
# fields = ('price', 'date')
# 编辑页面, 只显示如上字段, 也就是只能编辑如上页面
# fields = (('price', 'date'),)
# 在一行显示
# exclude = ('date',)
# 除了哪个字段不在编辑页面显示
# fieldsets = (('分组一', {'fields': ['price', 'title']}),
# ('分组二', {'fields': ['date']},))
# 和fields类似, 只不过是多加了个分组
# 一表多关联, 实现的是当编辑出版社时,因为它是普通表没外键,只能修改自己的字段,下面的代码实现的是可以在publish表实现对书籍的修改
# 只能编辑自己详情会细说的
class Bo(admin.TabularInline):
model = models.Books # 把books表关联起来
extra = 1 # 额外加几个空的
class PublishAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [Bo] # 把 book加入
admin.site.register(models.Authors)
admin.site.register(models.Books, BookAdmin)
# 注册, 还要把自定义的模型加入
admin.site.register(models.Publishes, PublishAdmin)
其中包括主要的功能
- 在model里自定义一个字段, 实现大于价格500,变红,mark_safe
- admin中
- 根据用户不同限制能看到的内容, 权限
- 在admin中显示多对多字段, 默认不会显示
- 在admin中自定义字段
- 批量操作action
- 其他一些操作
-
一表多关联, 实现的是当编辑出版社时,因为它是普通表没外键,只能修改自己的字段,下面的代码实现的是可以在publish表实现对书籍的修改
class Bo(admin.TabularInline):
model = models.Books # 把books表关联起来
extra = 1 # 额外加几个空的
class PublishAdmin(admin.ModelAdmin):
list_display = ['name']
inlines = [Bo] # 把 book加入
admin.site.register(models.Publishes, PublishAdmin)
# 别忘了注册