自定义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. 最新阿里云申请免费SSL证书实现网站HTTPS化(图文教程一)

    一.申请免费SSL证书: 1.登录阿里云: 2.领取代金券礼包: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=0a ...

  2. pycharm的断点调试与TODO标记

    断点调试的方法: 断点调试在程序比较大的时候调试运用的比较多 点击Pycharm软件右上角绿色三角形右边的小甲鱼图标,点击之后会弹出断点调试的界面 Debug是用来调试bug的 terminal 是终 ...

  3. asp.net core mvc 在中间件中使用依赖注入问题:System.InvalidOperationException: Cannot resolve scoped service 'IXXXService' from root provider.

    今天在弄JWT的时候需要用到用户验证使用一个自己写好的验证,但在出现了:System.InvalidOperationException: Cannot resolve scoped service ...

  4. 判断文件的编码 python

    import chardet import string path1= r'C:\Users\25456\Desktop' path = path1 + r'\深度学习.txt' with open( ...

  5. 生产环境nginx配置文件(带https安全认证)

    #user www www; worker_processes 2; error_log logs/error.log info; pid /usr/local/nginx/nginx.pid; wo ...

  6. CentOS7──xxx is not in the sudoers file

    提示"xxx is not in the sudoers file. This incident will be reported.其中 ”XXX“是你的用户名,也就是你的用户名没有权限使用 ...

  7. polyfillJS生成promise对象

    https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js

  8. Linux环境部署SVN服务器

    1. 安装SVN服务器: 检查是否已安装 # rpm -qa subversion 安装SVN服务器 # yum install httpd httpd-devel subversion mod_da ...

  9. 关于Oracle配置一些需要注意地方(IIS相关)

    说明:多重复,把各种坑走一次,并知道如何不走坑或者把坑填满,然后再复盘重新走一次,另外,你必须比一般人多付出一些,因为你起步慢了,另 外,你白天的效率不算高,精神状态不好,“试用期”就意味着有淘汰的可 ...

  10. iOS日历控件

    项目需要,前一阵子重构了下iPad工程,添加了一个滚动无缝日历. 当时没有头绪,网上找了一个源码改吧改吧就上线了(参考链接),这个功能很多而且流畅性也特别好,推荐不会写的可以参考下. 这几天,活不太忙 ...