Django入门 ----管理后台(Admin)

文章目录

    • 1. 使用Django Admin
      • 1. 创建超级用户superuser
      • 2. 注册模型
      • 3. 自定义需要展示的字段
      • 4. 自定义展示字段的细节
      • 5. 优化ForeignKey
      • 6. 多对多字段选择
      • 7. Inline表单

1. 使用Django Admin

  • 使用Django Admin,可通过后台管理对一个模型(数据表)的增删查改

1. 创建超级用户superuser

python manage.py createsuperuser
  • 访问 http://127.0.0.1:8000/admin/ ,用户名和密码登录

2. 注册模型

  • blog的APP,里面包含了一个叫Article的模型
  • 对文章进行管理, 你只需找到blog目录下的admin.py,使用admin.site.register方法注册Article模型
  • 不过这样只有一个文章标题title展示,无其他字段展示
#blog/admin.py
from django.contrib import admin
from .models import Article

# Register your models here.
admin.site.register(Article)

3. 自定义需要展示的字段

  • 自定义数据表中哪些字段可以显示,哪些字段可以编辑,并对数据表中的条目进行排序,同时定义过滤选项
  • Django的ModelAdmin自带的 list_display, list_filter, list_per_page, list_editable, date_hierarchyordering选项可以实现
# blog/admin.py
from django.contrib import admin
from .models import Article
from django.utils.html import format_html

# 先定义ArticleAdmin类
# 然后使用admin.site.register(Article, ArticleAdmin)方法即可
class ArticleAdmin(admin.ModelAdmin):
    # 定制哪些字段需要展示
    list_display = ('title', 'author', 'status', 'create_date', )
    
    # list_display_links = ('title', ) # 默认
    # sortable_by # 排序

    '''定义哪个字段可以编辑'''
    list_editable = ('status', )

    '''分页:每页10条'''
    list_per_page = 5

    '''最大条目'''
    list_max_show_all = 200 #default

    '''搜索框 ^, =, @, None=icontains'''
    search_fields = ['title']

    '''按日期分组'''
    date_hierarchy = 'create_date'

    '''默认空值'''
    empty_value_display = 'NA'

    '''过滤选项'''
    list_filter = ('status', 'author__is_superuser', ) 

admin.site.register(Article, ArticleAdmin)

Django入门 ----管理后台(Admin)_第1张图片

4. 自定义展示字段的细节

  • 比如对上面的创建日期进行自定义一个时间格式(比如以2020-11-09 15:00)展示,并以红色标注
  • 修改 admin.py, 在ArticleAdmin类中新增一个 custom_date()
# Register your models here.
class ArticleAdmin(admin.ModelAdmin):


    # Custom admin list view
    list_display = ('title', 'author', 'status', 'create_date', 'custom_date', )
    '''中间省略'''    
    '''custom field on list view'''
    def custom_date(self, obj):
        return format_html(
            '{}',
            obj.create_date.strftime("%Y-%m-%d %H:%M:%S")
        )


    custom_date.short_description = '定制格式及颜色'

Django入门 ----管理后台(Admin)_第2张图片

5. 优化ForeignKey

  • admin中添加或修改一个对象时,对 ForeignKey 字段默认使用下拉菜单显示,用于选择
    Django入门 ----管理后台(Admin)_第3张图片
  • 优化1:使用 autocomplete_fields,基于jquery select2带搜索框的下拉菜单,适合中等数量的选项
  • 优化2:使用 raw_id_fields,用弹出窗口搜索对象(额外弹出一个小页面),适合数量非常多的选项
# Register your models here.
class ArticleAdmin(admin.ModelAdmin):

    list_display = ('title', 'author', 'status', 'create_date', 'custom_date', )
    '''中间省略'''
    # 优化1用这行
    autocomplete_fields = ['author'] # use select2 to select user    

	
	# 优化2用这行
	raw_id_fields = ("author",) # use a pop-out search window for a foreign key   

Django入门 ----管理后台(Admin)_第4张图片
Django入门 ----管理后台(Admin)_第5张图片

6. 多对多字段选择

  • admin对于多对多字段默认使用多选下拉菜单,不方便
  • 建议使用 filter_horizontalfilter_vertical 设置,其展示效果为双向穿梭选择器
    Django入门 ----管理后台(Admin)_第6张图片

7. Inline表单

  • author 和 article 是单对多的关系
  • 创建或编辑用户时想一次性添加多篇文章,可使用inline表单
  • 用Article模型创建两个Inline类,一个用于展示和编辑已创建的文章列表,一个用于一次性添加多篇文章
# blog/admin.py
from django.contrib.auth import get_user_model
User = get_user_model()


class ArticleListInline(admin.TabularInline):
    model = Article
    # Article模型可能有多个外键,这里指定使用author这个外键,
    fk_name = "author"
    # readonly_fields = ('title', 'body', 'status')
    # can_delete = False
    max_num = 3

    verbose_name = _('Edit Articles')
    verbose_name_plural = _('Edit Articles')
    extra = 2 # 

    """ 不允许这个inline类增加记录  """
    def has_add_permission(self, request, obj=None):
        return False

class ArticleAddInline(admin.TabularInline):
    model = Article
    fk_name = "author"
    extra = 2
    can_delete = False

    verbose_name = _('Add Articles')
    verbose_name_plural = _('Add Articles')

    """ 这时仅用于添加数据的Inline,返回空的queryset """
    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.none()
# blog/admin.py 添加
class UserAdmin(admin.ModelAdmin):
    search_fields = ['username']

    inlines = [
        ArticleAddInline,
        ArticleListInline,
    ]

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

Django入门 ----管理后台(Admin)_第7张图片

你可能感兴趣的