Django admin一些设置

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)

其中包括主要的功能

  1. 在model里自定义一个字段, 实现大于价格500,变红,mark_safe
  2. admin中
  3. 根据用户不同限制能看到的内容, 权限
  4. 在admin中显示多对多字段, 默认不会显示
  5. 在admin中自定义字段
  6. 批量操作action
  7. 其他一些操作
  8. 一表多关联, 实现的是当编辑出版社时,因为它是普通表没外键,只能修改自己的字段,下面的代码实现的是可以在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)
# 别忘了注册

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值