Django Admin高级开发:多层级内联嵌套包nested-admin

Django-nested-admin是一个可以嵌套admin内联的项目(即在InlineModelAdmin类上定义内联)。Django admin自带两种嵌套方式TabularInline和StackedInline,用于在父模型的编辑页面中以表格形式显示关联的子模型对象。

一、安装

pip install django-nested-admin

二、配置

  1. setting.py添加如下
INSTALLED_APPS = (    # ...    'nested_admin',)

2.配置url.py

urlpatterns = [    # ...    path('_nested_admin/', include('nested_admin.urls')),]

3.说明

使用django-nested-admin,请使用以下类代替它们的django admin原有的model方法

django.contrib.admin nested_admin
ModelAdmin NestedModelAdmin
InlineModelAdmin NestedInlineModelAdmin
StackedInline NestedStackedInline
TabularInline NestedTabularInline

三、实例

使用django-nested-admin实现三级嵌套

models.py

class Choice(models.Model):    #投票选项表    question = models.ForeignKey(Question, on_delete=models.CASCADE,editable=False,related_name='q_choice', )    choice_text = models.CharField("选项内容",max_length=200)    img = models.ImageField("选项图", upload_to="media/polls/",null=True,blank=True)    votes = models.IntegerField("投票数",default=0,editable=False)    ctime = models.DateTimeField("创建时间", auto_now_add=True, blank=True, max_length=20)    def __str__(self):        return self.choice_text    class Meta:        db_table = "choice"        verbose_name = "投票选项"        verbose_name_plural = verbose_name

admin.py

import nested_admin
class ChoiceInline(nested_admin.NestedTabularInline):    model = Choice    extra =4    exclude = ('question','question_id',)    readonly_fields = ('votes',)  class QuestionInline(nested_admin.NestedStackedInline):    model = Question    inlines = [ChoiceInline]    extra = 1     @admin.register(Polls)class PollsAdmin(nested_admin.NestedModelAdmin):    # form = PollsForm    list_display =['ordinal_number','title','questions','starttime','endtime','view','max','analysis','ctime']    list_display_links = ('title',)    inlines = [QuestionInline]

最终运行效果:

图片

可以实现三级嵌套并动态添加

github:https://github.com/theatlantic/django-nested-admin官方文档:https://django-nested-admin.readthedocs.io/en/latest/

菲宇 Python与Django学习

THE END