• 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 ^_^~"
  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/xiaobaozi-95/p/10316118.html
Copyright © 2020-2023  润新知