自定义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'

# 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 ^_^~"

Django的admin相关的更多相关文章

  1. 08/27 Django admin相关

    一.django-admin的简单回顾: admin: Django的后台数据管理的web版本 1.admin a:models.py - 创建表 b:admin.py - 注册表    admin. ...

  2. 【django之admin,单例模式】

    一.admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...

  3. Django之admin的使用和源码剖析

    admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLE ...

  4. Django 之 admin管理工具

    -------------------------------------------------------------------------妄尝恶果,苦果自来. admin组件使用 Django ...

  5. stark组件之过滤操作【模仿Django的admin】

    一.先看下django的admin是如何实现过滤操作 首先在配置类中顶一个list_filter的列表,把要过滤的字段作为元素写i进去就可以了 class testbook(admin.ModelAd ...

  6. stark组件之路由分发【模仿Django的admin】

    一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...

  7. django 用户管理相关的表

    Django 用户管理相关的表: create table django_content_type ( /* 内容类型表 */ id ) not null auto_increment, app_la ...

  8. django之admin设置

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索总结出比较实用的配置.若你有什么比较好的配置 ...

  9. django中admin的使用

    转载网址:https://www.cnblogs.com/wumingxiaoyao/p/6928297.html     Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理 ...

随机推荐

  1. JSON错误

    今天遇到了json转换的错误. 原因:少导入了jar包 解决方法把所有的jar导入

  2. C# 数组在内存中的存储

    C# 数组是引用类型,那么在内存中是如何存储的呢? 在VS中调试C#程序,如何查看内存.寄存器.反汇编 在这篇文章里看到了如何在VS 中查看内存 先断点打在数组创建后语句那里,点debug->W ...

  3. docker容器实战-----初级<2>

    第二章  docker容器 1. Docker是通过内核虚拟化技术(namespaces及cgroups cpu.内存.磁盘io等)来提供容器的资源隔离与安全保障等.由于Docker通过操作系统层的虚 ...

  4. Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配

    office版本:2016 系统版本:win10 问题描述: 1.桌面新建excel表格后,打开时,提示“Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效.请确定文件未损坏,并且文 ...

  5. JAVA EE 第二周(XML简述以及web请求的过程)

    一. 对于XML,我分别从以下几个方面来简述: 1.定义: XML是一种可扩展的标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. (可扩展标记语言:可扩展标记语言是一 ...

  6. maven 项目连接mysql8.0版本时的注意事项

    MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以前的maven项目,要注意依赖的注入 查看pom. ...

  7. 使用 lsyncd 同步文件

    https://unix.stackexchange.com/questions/307046/real-time-file-synchronization https://github.com/ax ...

  8. Python爬虫与一汽项目【二】爬取中国东方电气集中采购平台

    网站地址:https://srm.dongfang.com/bid_detail.screen 东方电气采购的页面看似很友好,实际上并不好爬取 在观察网页的审查元素之后发现,1处的网页响应只是单纯的一 ...

  9. 原创《weex面向未来的架构》

    最近一直在做weex的调研工作,整理之后给公司做了一次技术分享. 分享内容如下: 1:Weex是什么? 2:  Weex目前能做什么? 3:  Weex 如何调试 4:  剖析一下Weex原理 5: ...

  10. log4j日志实现重复警告slf4j-jdk14和log4j-over-slf4j

    因为各种三方库依赖的log4j实现不同,所以可能会出现找到多个log4j实现的警告,但是不影响程序(logback是会影响的),如下: SLF4J: Class path contains multi ...