django 之 admin

admin 是django 自带的用来让你进行数据库管理的web app.
提供了很多定制化功能,你甚至可以用它来进行公司内部的内容管理

 

启用admin

用startproject命令创建项目时django admin就默认启用了

步骤:

1.添加"django.contrib.admin"到项目的设置settings中的INSTALLED_APPS。

2.admin有四个依赖项—

django.contrib.auth,

django.contrib.contenttypes,

django.contrib.messages,

和django.contrib.sessions。

如果这些应用程序不在项目中的INSTALLED_APPS列表中,则添加它们。

3.Add django.contrib.auth.context_processors.auth and django.contrib.messages.context_processors.messages to the 'context_processors' option of the DjangoTemplates backend defined in your TEMPLATES as well as django.contrib.auth.middleware.AuthenticationMiddleware and django.contrib.messages.middleware.MessageMiddleware to MIDDLEWARE. 

这些默认情况下都是活动的,所以你只需要在手动调整设置后才需要这样做。

4.确定应用程序的哪个模型应该在管理界面中编辑。

 

admin 访问地址

http://localhost:yourport/admin/

默认 http://127.0.0.1:8000/admin/

 

操作步骤

1.创建后台管理员

python manage.py createsuperuser

  

  

2.设置数据表名称

 

class UserType(models.Model):
    name = models.CharField(max_length=50)
  
    class Meta:
        verbose_name = '用户类型'
        verbose_name_plural = '用户类型'

  

 

3.在每个app下有个admin.py文件 ,在那里面注册你想要被管理的表

from django.contrib import admin
 
# Register your models here.
 
from app01 import models
 
 
admin.site.register(models.Article)
admin.site.register(models.Account)

 

 

admin定制

你可以定义每张表显示哪些字段、对某些字段进行过滤、允许搜索等功能,这就需要定制一下admin的类了

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','account','read_count')
     
admin.site.register(models.Article, ArticleAdmin)

  

fields 决定对表进行修改时展示哪些字段

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','account','read_count')
    fields = ['title','account','pub_date']

  

还可以多个字段显示在一行。

fields = ['title','account',('pub_date','read_count')]

  

exclude 不展示哪些字段  

date_hierarchy = 'pub_date'  按日期分类显示数据  

你也可以在一个相关的模型上指定一个字段,例如:
date_hierarchy = 'author__pub_date'

 

fieldsets 分组显示

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','account','read_count')
    date_hierarchy = 'pub_date'
 
    fieldsets = (('文章相关',{
        'fields':('title','content'),
        'classes': ('wide', 'extrapretty'),
    }),('高级',{
        'classes':('collapse',),
        'fields':(('account','read_count'),'pub_date')
    }))

  

filter_horizontal,filter_vertical 均用于多对多字段 

filter_horizontal = ['tags',]

  

list_display  定义表数据显示哪些列

除了表中有的字段,models自己定义的字段也能放入list_display

from django.db import models
from django.contrib import admin
 
class Person(models.Model):
    name = models.CharField(max_length=50)
    birthday = models.DateField()
 
    def decade_born_in(self):
        return self.birthday.strftime('%Y')[:3] + "0's"
    decade_born_in.short_description = 'Birth decade'
 
class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'decade_born_in')

  

自定义标签

#models.py


from django.utils.html import format_html

class Tag(models.Model):
    """文章标签表"""
    name = models.CharField(max_length=64,unique=True)
    date = models.DateTimeField(auto_now_add=True)
    color_code = models.CharField(max_length=6)
 
    def colored_name(self):
        return format_html(
            '<span style="color: #{};">{}</span>',
            self.color_code,
            self.name,
        )
 
    def __str__(self):
        return self.name


#admin.py


class TagAdmin(admin.ModelAdmin):
    list_display = ['name','colored_name']

 

from django.utils.safestring import mark_safe

format_html和mark_safe非常类似,本质还是调用mark_safe函数,不同在于传参方式,mark_safe直接传递完整的html字符串;

而format_html需要使用{}占位符:

 

 

 

list_display_links = ('first_name', 'last_name') 点下这2个字段就跳到修改页

list_filter 过滤,把要过滤的字段放到对应列表里就可以

list_filter = ('register_date',)

  

list_per_page = 20 每页显示20条数据

  

radio_fields 把外键或choice字段由下拉框变成单选框

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','pub_date','account','read_count')
    date_hierarchy = 'pub_date'
    filter_horizontal = ['tags',]
    radio_fields = {'account': admin.VERTICAL}

  

自动补全

autocomplete_fields = ['account',] 自动补全,外键查询数据多时,方便查找  

 

raw_id_fields  言语无法表示的字段

就把外键变成这样子

 

readonly_fields = ('address_report',)  只读字段

search_fields  模糊查找

search_fields = ['account__username','title']

  

 

posted @ 2020-06-29 04:48  JIMfan  阅读(176)  评论(0)    收藏  举报