自定义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. Python实现bp神经网络识别MNIST数据集

    title: "Python实现bp神经网络识别MNIST数据集" date: 2018-06-18T14:01:49+08:00 tags: [""] cat ...

  2. ubuntu window 10 双系统

    https://rufus.ie/ U盘制作工具 http://releases.ubuntu.com/18.04/ubuntu-18.04.2-desktop-amd64.iso   ubuntu ...

  3. audio google play()

    <audio id="music" src="" preload loop="loop" autostart="true&q ...

  4. sql server中的while循环语句

    语法格式: while 条件 begin ....... end declare @num begin update SDetail end

  5. maven 控制台 打包

    maven打包方法1.打开cmd,进入到项目的根目录2.执行命令:mvn clean package等待结束.结束后到目录的target子目录中找jar文件即可

  6. 在.NET Core使用TimeZone将客户端时间转服务器本地时间但编译提示已过期

    当我们的项目国际化后,需要处理时区问题. 在.NET Core之前我们可以通过以下代码将客户端时间转换为服务端时间: DateTime serverTime = TimeZone.CurrentTim ...

  7. node.js浅见

    看过很多朋友node.js代码敲得很好,但是对于概念还是很生疏.个人认为,代码是树叶,树干搭起来才是王道. 1.简述node.js的适用场景: IIO密集而非计算密集的情景:高并发微数据(比如账号系统 ...

  8. js filter 数组去重

    let arr = [1, 2, 3, 10, 4, 5, 1, 3, 5]; let stateNumArr = arr.filter((item, index, array) => { re ...

  9. 用keytool制作证书并在tomcat配置https服务(二 )

    用keytool制作证书并在tomcat配置https服务(一) 双向认证: 我们上边生成了服务端证书,并发送给客户端进行了验证. 双向认证是双向的,因此还差客户端证书. 1.为方便导入浏览器,生成p ...

  10. JZ2440学习笔记之第一个裸机程序(Keil-MDK)

    CPU:S3C2440, ARM920T, Internal 4KB RAM, Support boot from NAND flash, 128MB for each bank. JZ2440:Me ...