Django的admin相关

 自定义admin展示的内容

根据之前已经创建好了的models

from django.db import models
class Person(models.Model):
    name = models.CharField(max_length=64, unique=True)
    age = models.IntegerField()
    birthday = models.DateField()
    gender_choices = ((u'male', ''), (u'female', ''))
    gender = models.CharField(max_length=6, choices=gender_choices, default='male')
    blog_url = models.URLField(verbose_name="网址")
    email = models.EmailField(help_text="写入一个类似123@qq.com的格式")
    host = models.GenericIPAddressField(null=True, blank=True)
    def __str__(self):
        return self.name
    class Meta:
        verbose_name_plural = '个人信息'
models.py

  配置admin.py,自定义要展示的内容

  • 第一种:通过继承ModelAdmin类来定义admin里的内容。ModelAdmin类是admin接口中model的表现形式
from django.contrib import admin
from .models import Person
class Person_Display(admin.ModelAdmin):
    list_display = ("name", "birthday", "gender", "blog_url", "email", "host")   # 要显示的字段
admin.site.register(Person, Person_Display)
  • 第二种:也可以使用@admin.register装饰器注册ModelAdmin
from django.contrib import admin
from .models import Person

@admin.register(Person)
class Person_Display(admin.ModelAdmin):
    list_display = ("name", "birthday", "gender", "blog_url", "email", "host")

查看admin:

 

list_display    控制admin的更改列表页面上显示的字段。如果没有设置list_display,只显示一列,显示__str__()的对象。

    特殊情况:

  •  如果字段是 ForeignKey,将显示__str__的对象
  •  不支持 ManyToManyField 类型
  •    可以调用models里面类的方法。将默认HTML转义输出,要使html格式生效,需要使用format_html()。 通过short_description 可以给models类的方法加上名字。

         例如: # models.py

from django.db import models
from django.utils.html import format_html

class Person(models.Model):
.........
    gender_choices = (('male', ''), ('female', ''))
    gender = models.CharField(max_length=6, choices=gender_choices, default='male')
    def colored_gender(self):
        if self.gender == 'male':
            return format_html('<span style="color: green;">男生</span>')
        else:
            return format_html('<span style="color: red;">女生</span>')    
colored_gender.short_description = "性别" #可以通过添加short_description属性来自定义列的标题

   # admin.py

from django.contrib import admin
from .models import Person

@admin.register(Person)
class Person_Display(admin.ModelAdmin):
    list_display = ("name", "birthday", "blog_url", "email", "host", "colored_gender",)

list_editable   允许在列表页面上对字段进行编辑

list_filter      激活admin列表页面右侧边栏中的过滤器。

list_per_page   一页显示的项目数,默认为100

ordering         排序,字段前面加一个- ,表示倒序

search_fields    启用列表页面上的搜索框。如果有外键或者多对多关联,可以通过foreignkey__fieldname搜索。

                            例如 student 列表里,search_fields = ('school__name',)。可以可以通过学校名字搜索学生条目。

示例:

from django.contrib import admin
from .models import Person
@admin.register(Person)
class Person_Display(admin.ModelAdmin):
    list_display = ( "name", "birthday", "blog_url", "email", "host", "colored_gender",)       #展示的字段
    list_editable = ('blog_url', )     # 可以在列表页面编辑
    list_filter = ("name", "birthday")   #右边导航栏的过滤器
    list_per_page = 3                #一页显示的条目
    ordering = ["-birthday", ]      #按生日倒序
    search_fields = ["name", ]     # 搜索栏

修改一条对象里面的显示内容:

filter_horizontal(多对多)  默认在admin某一个对象管理里面,ManyToMany显示为一个多选框。
                                    增加此选项,允许在选项内进行搜索。未选中和选定的选项并排显示在两个框中。

   例如   在student  设置filter_horizontal = ( 'teacher',)   

------------------》

filter_vertical  与filter_horizontal相同,不过是竖排。

raw_id_fields(外键)   默认ForeignKey字段是一个选择框,为了减小开销,可以将其改为选择一个窗口小部件选择。

      ---------》

弹出小窗

更多参考:  https://docs.djangoproject.com/en/2.1/ref/contrib/admin/

 

 添加Admin Action

如果要同时对许多对象进行相同的更改,那么可以定制admin action,批量操作列表里的对象。

 

例如,将学生里未注册的全部改为已注册。

# models.py

from django.db import models
from django.utils.html import format_html
class Student(models.Model):
    sname = models.CharField(max_length=64)
    age = models.IntegerField()
    statu_choices = (('registered', u'已注册'),
                       ('unregister', u'未注册'),
                       )
    status = models.CharField(choices=statu_choices, max_length=32, default='unregister')
    def __str__(self):
        return self.sname
    def status_color(self):
        if self.status == 'registered':
            f = format_html( '<span style="padding:2px;background-color:green;">已注册</span>')
        else:
            f = format_html('<span style="padding:2px;background-color:red;">未注册</span>')
        return f
    status_color.short_description = 'status'
View Code

 # admin.py

def make_register(modelAdmin, request, queryset): #action函数
    queryset.update(status='registered')  # 修改字段
make_register.short_description = 'Make register'    # 动作描述

@admin.register(Student) class Student_More_Info(admin.ModelAdmin): actions = [make_register] #添加动作

 1, 写动作函数。我们需要编写一个在从admin触发操作时调用的函数。 Action函数只是带有三个参数的常规函数​​:

                            当前ModelAdmin,一个HttpRequest表示当前请求,QuerySet包含用户选择的一组对象。

 2,添加动作    action=[]

 

action高级写法:将action作为ModelAdmin的方法

因为action和Person对象是紧密耦合的,所以可以将action放到Person_display对象中:

from django.contrib import admin
from .models import Person
@admin.register(Person)
class Person_Display(admin.ModelAdmin):
    actions = ['change_gender', ]    # action列表里面是字符串,而不是函数
    def change_gender(self, request, queryset):  # modeladmin参数改为self
        queryset.update(gender='female')
    change_gender.short_description = "Mark selected person as  female ^_^~"

 

posted @ 2019-01-30 16:54  卡布爱学习  阅读(338)  评论(0编辑  收藏  举报