Djangomanagement界面

LearningDjangomanagement界面 configuration, modelregister and 自定义

Djangomanagement界面overview

Djangomanagement界面 is Djangoframeworkproviding 一个强 big functions, 它可以自动生成management界面, 用于managementapplicationin data. throughmanagement界面, management员可以easily地creation, 读取, update and deletedatalibraryin data, 而不需要writing任何额 out code.

提示

Djangomanagement界面主要用于 after 台management, 不适合serving as面向user before 端界面.

creationmanagement员user

in usingDjangomanagement界面之 before , 需要creation一个management员user:

python manage.py createsuperuser

执行该commands after , 会提示输入user名, 邮箱 and password:

user名 (leave blank to use 'admin'): admin
电子email地址: admin@example.com
Password:
Password (again):
Superuser created successfully.

访问management界面

启动Developmentserver after , 可以through以 under URL访问management界面:

http://127.0.0.1:8000/admin/

using之 before creation management员user名 and passwordlogin after , 就可以看 to Djangomanagement界面 首页.

registermodel to management界面

默认circumstances under , Djangomanagement界面只显示 in 置 user and 组model. 要 in management界面inmanagement自定义model, 需要将modelregister to management界面.

basicregister

in application admin.pyfileinregistermodel:

# blog/admin.py
from django.contrib import admin
from .models import BlogPost, Comment

# registermodel
admin.site.register(BlogPost)
admin.site.register(Comment)

register after , 刷 new management界面, 就可以看 to register model.

自定义management界面

可以throughcreationModelAdminclass来自定义model in management界面in 显示方式:

# blog/admin.py
from django.contrib import admin
from .models import BlogPost, Comment

# 自定义BlogPostmanagement界面
class BlogPostAdmin(admin.ModelAdmin):
    # list页显示 字段
    list_display = ['title', 'is_published', 'pub_date', 'update_date']
    # 可搜索 字段
    search_fields = ['title', 'content']
    # filter字段
    list_filter = ['is_published', 'pub_date']
    # sort字段
    ordering = ['-pub_date']
    # list页可编辑字段
    list_editable = ['is_published']
    # 分页数量
    list_per_page = 10
    # 详情页字段group
    fieldsets = (
        ('basicinformation', {
            'fields': ('title', 'content')
        }),
        ('release设置', {
            'fields': ('is_published',)
        }),
    )

# 自定义Commentmanagement界面
class CommentAdmin(admin.ModelAdmin):
    list_display = ['name', 'email', 'post', 'created_at']
    search_fields = ['name', 'email', 'content']
    list_filter = ['post', 'created_at']
    ordering = ['-created_at']
    # 只读字段
    readonly_fields = ['created_at']

# registermodel and 自定义managementclass
admin.site.register(BlogPost, BlogPostAdmin)
admin.site.register(Comment, CommentAdmin)

常用ModelAdmin选项

  • list_display: list页显示 字段.
  • list_display_links: list页可点击 字段, 用于跳转 to 详情页.
  • list_editable: list页可直接编辑 字段.
  • list_filter: right 侧filter栏 字段.
  • search_fields: 顶部搜索框可搜索 字段.
  • ordering: 默认sort字段.
  • list_per_page: list页每页显示 数量.
  • fieldsets: 详情页字段 group and 布局.
  • fields: 详情页显示 字段, 不group.
  • exclude: 详情页排除 字段.
  • readonly_fields: 只读字段.
  • prepopulated_fields: 自动填充 字段.
  • filter_horizontal: many for many 字段 水平选择器.
  • filter_vertical: many for many 字段 垂直选择器.
  • raw_id_fields: out 键字段 原始ID输入框.

自定义management界面样式

可以through以 under 方式自定义Djangomanagement界面 样式:

modifymanagement界面标题 and 站点标题

# mysite/admin.py
from django.contrib import admin

# modifymanagement界面标题
admin.site.site_header = '我 博客managementsystem'
# modify站点标题
admin.site.site_title = '博客management'
# modify首页标题
admin.site.index_title = '欢迎using博客managementsystem'

自定义management界面模板

可以through重写Djangomanagement界面 模板来自定义其 out 观. 首先需要 in projectincreationtemplatesTable of Contents, 并 in 其increationadmin子Table of Contents:

mysite/
├── templates/
│   └── admin/
│       └── base_site.html

然 after in base_site.htmlin重写management界面 模板:

{% extends "admin/base_site.html" %}

{% block extrahead %}
    {{ block.super }}
    <style>
        /* 自定义CSS样式 */
        #header {
            background-color: #4285F4;
        }
        .module h2, .module caption, .inline-group h2 {
            background-color: #4285F4;
        }
    </style>
{% endblock %}

{% block branding %}
    <h1 id="site-name">
        <a href="{% url 'admin:index' %}">我 博客managementsystem</a>
    </h1>
{% endblock %}

最 after , in settings.pyinconfiguration模板Table of Contents:

# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 添加模板Table of Contents
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

in 联management

in 联management允许 in 一个model management界面in编辑其关联model data. 例such as, 可以 in 博客文章 management界面in直接编辑其评论.

一 for many relationships in 联

# blog/admin.py
from django.contrib import admin
from .models import BlogPost, Comment

# 定义Comment in 联class
class CommentInline(admin.TabularInline):  #  or StackedInline
    model = Comment
    extra = 1  # 额 out 显示 空表单数量
    readonly_fields = ['created_at']  # 只读字段

# 自定义BlogPostmanagement界面, 添加Comment in 联
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ['title', 'is_published', 'pub_date']
    inlines = [CommentInline]  # 添加 in 联

admin.site.register(BlogPost, BlogPostAdmin)

TabularInline and StackedInline 区别:

  • TabularInline: 表格形式显示, 紧凑节省空间.
  • StackedInline: 堆叠形式显示, 每个关联object占一行, 适合字段较 many circumstances.

自定义managementoperation

可以 in management界面in添加自定义operation, 用于批量processingdata.

# blog/admin.py
from django.contrib import admin
from django.contrib import messages
from .models import BlogPost

class BlogPostAdmin(admin.ModelAdmin):
    list_display = ['title', 'is_published', 'pub_date']
    actions = ['make_published', 'make_unpublished']  # 添加自定义operation
    
    # 自定义operation: 批量release
    def make_published(self, request, queryset):
        # 执行operation
        updated = queryset.update(is_published=True)
        # 显示成功message
        self.message_user(request, f'成功release了 {updated} 篇文章. ', messages.SUCCESS)
    
    # 设置operation名称
    make_published.short_description = '批量release选in 文章'
    
    # 自定义operation: 批量取消release
    def make_unpublished(self, request, queryset):
        updated = queryset.update(is_published=False)
        self.message_user(request, f'成功取消release了 {updated} 篇文章. ', messages.SUCCESS)
    
    make_unpublished.short_description = '批量取消release选in 文章'

admin.site.register(BlogPost, BlogPostAdmin)

management界面permission控制

Djangomanagement界面providing了细粒度 permission控制, 可以throughuser and 组来managementpermission.

permissionclass型

for 于每个model, Django会自动creation四个permission:

  • 查看permission (view) : 允许查看modeldata.
  • 添加permission (add) : 允许添加modeldata.
  • modifypermission (change) : 允许modifymodeldata.
  • deletepermission (delete) : 允许deletemodeldata.

分配permission

可以throughmanagement界面 user or 组页面来分配permission:

  1. loginmanagement界面, 进入"authentication and authorization"部分.
  2. 选择"user" or "组".
  3. 选择要编辑 user or 组.
  4. in "permission"部分, 勾选要分配 permission.
  5. 保存更改.

自定义permission

可以 in modelin定义自定义permission:

# blog/models.py
from django.db import models

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    is_published = models.BooleanField(default=False)
    pub_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True)
    
    class Meta:
        # 自定义permission
        permissions = [
            ('can_publish_posts', 'Can publish posts'),
            ('can_view_unpublished_posts', 'Can view unpublished posts'),
        ]
    
    def __str__(self):
        return self.title

定义自定义permission after , 需要执行migration:

python manage.py makemigrations
python manage.py migrate

management界面performanceoptimization

for 于 big 量data model, management界面可能会变得很 slow . 可以through以 under 方式optimization:

  • usingselect_related() or prefetch_related(): reducingdatalibraryquery次数.
  • 限制list_displayin 字段数量: reducing每行显示 data量.
  • usingraw_id_fields替代默认 out 键选择器: for 于 big 量data out 键, usingraw_id_fields可以improvingperformance.
  • 限制list_per_page 数量: reducing每页显示 data量.
  • 避免 in list_displayinusing complex method: complex method会降 low list页 渲染速度.
# blog/admin.py
class BlogPostAdmin(admin.ModelAdmin):
    list_display = ['title', 'author', 'is_published', 'pub_date']
    raw_id_fields = ['author']  # usingraw_id_fields替代默认  out 键选择器
    
    # optimizationquery, reducingdatalibraryquery次数
    def get_queryset(self, request):
        return super().get_queryset(request).select_related('author')

练习 1: registermodel to management界面

  1. in blogapplicationincreationCategorymodel, package含name字段.
  2. in BlogPostmodelin添加category out 键字段.
  3. 执行migration.
  4. in admin.pyinregisterCategory and BlogPostmodel.
  5. 自定义BlogPostmanagement界面, 显示标题, classification, is 否release and release日期.
  6. testmanagement界面 functions.

练习 2: 添加 in 联 and 自定义operation

  1. in BlogPostmanagement界面in添加Comment in 联.
  2. 添加自定义operation, 用于批量release and 取消release文章.
  3. modifymanagement界面 标题 and 站点标题.
  4. test in 联 and 自定义operation functions.