一个类别包含多篇文章,假设我们希望在查看编辑某个类别信息时,一同显示并编辑同属该类别下的所有文章信息,我们可以定义先定义ArticleInline类,然后把其附在CategoryAdmin里。这样我们就可以实现在同一页面上编辑类别和所属文章信息了,是不是很帅?
#blog/admin.py
from django.contrib import admin
from .models import Article, Category, Tag
class ArticleInline(admin.TabularInline):
model = Article
'''设置列表可显示的字段'''
fields = ('title', 'author', 'status', 'mod_date',)
class CategoryAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('name',)}
raw_id_fields = ("parent_category", )
inlines = [ArticleInline, ]
admin.site.register(Category, CategoryAdmin)
展示效果如下所示。试想下,你想手动编写同样代码又要花多长时间?估计使用Mixins和Formsets早就让你心烦意乱了吧。
Django提供了两个InlineModelAdmin的子类:TabularInline和StackedInline,区别在于使用的模板, 一个横着,一个竖着,选项是一样的。InlineModelAdmin和ModelAdmin共同的常用options有:
form
fieldsets
fields
exclude
filter_horizontal
filter_vertical
ordering
prepopulated_fields
get_queryset()
radio_fields
readonly_fields
raw_id_fields
额外增加的options有:
InlineModelAdmin.model
inline使用的model,必需。
InlineModelAdmin.fk_name
model的name,当有多个外键时使用。
InlineModelAdmin.formset
缺省BaseInlineFormSet。
InlineModelAdmin.form
缺省ModelForm。当创建formset时传递给inlineformset_factory()。
InlineModelAdmin.extra
inline的额外数目。
InlineModelAdmin.get_extra()也返回inline的额外数目。
InlineModelAdmin.max_num
可展示得最大数目。
InlineModelAdmin.get_max_num()也返回此数字。
InlineModelAdmin.min_num
可展示的最小数目。
InlineModelAdmin.get_min_num()也返回此数目。
InlineModelAdmin.raw_id_fields
使用InlineModelAdmin一定要注意以下几点哦。
InlineModelAdmin不支持使用list_display选项,而要使用fileds或exclude选项来设置所数据表需要显示的字段。
当一个model有多个ForeignKey时,必需使用fk_name来设置主键。