• 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 ^_^~"
  • 相关阅读:
    web页面与多页应用(布局示例普通文档流)
    web页面与多页应用(一)
    Flutter,webview里面实现上传和下载的功能
    Flutter项目删除了相关的dart文件之后运行flutter run或者 F5编译运行时会报这个错误.... were declared as an inputs, but did not exist. Check the definition of target:kernel_snapshot for errors
    vue项目中,点击输入框的时候,弹出的键盘挡住了输入框,需要把输入框展示在可见区域中,不被遮挡
    在IE浏览器上,min-hheight:unset/line-hight:unset不生效问题解决,把unset换成auto,问题只要时IE浏览器设置unset不生效
    本人修改了,需要把新的AndroidManifest.xml 覆盖原来的,AndroidManifest.xml 覆盖问题
    使用Filter来过滤掉需要排除的数组对象
    深拷贝和浅拷贝
    正则表达式
  • 原文地址:https://www.cnblogs.com/xiaobaozi-95/p/10316118.html
Copyright © 2020-2023  润新知