文章目录
-
- 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展示,无其他字段展示
from django.contrib import admin
from .models import Article
admin.site.register(Article)
3. 自定义需要展示的字段
- 自定义数据表中哪些字段可以显示,哪些字段可以编辑,并对数据表中的条目进行排序,同时定义过滤选项
- Django的ModelAdmin自带的 list_display, list_filter, list_per_page, list_editable, date_hierarchy和ordering选项可以实现
from django.contrib import admin
from .models import Article
from django.utils.html import format_html
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'status', 'create_date', )
'''定义哪个字段可以编辑'''
list_editable = ('status', )
'''分页:每页10条'''
list_per_page = 5
'''最大条目'''
list_max_show_all = 200
'''搜索框 ^, =, @, None=icontains'''
search_fields = ['title']
'''按日期分组'''
date_hierarchy = 'create_date'
'''默认空值'''
empty_value_display = 'NA'
'''过滤选项'''
list_filter = ('status', 'author__is_superuser', )
admin.site.register(Article, ArticleAdmin)
4. 自定义展示字段的细节
- 比如对上面的创建日期进行自定义一个时间格式(比如以2020-11-09 15:00)展示,并以红色标注
- 修改 admin.py, 在ArticleAdmin类中新增一个 custom_date()
class ArticleAdmin(admin.ModelAdmin):
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 = '定制格式及颜色'
5. 优化ForeignKey
- admin中添加或修改一个对象时,对 ForeignKey 字段默认使用下拉菜单显示,用于选择
- 优化1:使用 autocomplete_fields,基于jquery select2带搜索框的下拉菜单,适合中等数量的选项
- 优化2:使用 raw_id_fields,用弹出窗口搜索对象(额外弹出一个小页面),适合数量非常多的选项
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'status', 'create_date', 'custom_date', )
'''中间省略'''
autocomplete_fields = ['author']
raw_id_fields = ("author",)
6. 多对多字段选择
- admin对于多对多字段默认使用多选下拉菜单,不方便
- 建议使用 filter_horizontal 或 filter_vertical 设置,其展示效果为双向穿梭选择器
7. Inline表单
- author 和 article 是单对多的关系
- 创建或编辑用户时想一次性添加多篇文章,可使用inline表单
- 用Article模型创建两个Inline类,一个用于展示和编辑已创建的文章列表,一个用于一次性添加多篇文章
from django.contrib.auth import get_user_model
User = get_user_model()
class ArticleListInline(admin.TabularInline):
model = Article
fk_name = "author"
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()
class UserAdmin(admin.ModelAdmin):
search_fields = ['username']
inlines = [
ArticleAddInline,
ArticleListInline,
]
admin.site.unregister(User)
admin.site.register(User, UserAdmin)