Django Admin高级开发:多层级内联嵌套包nested-admin
Django-nested-admin是一个可以嵌套admin内联的项目(即在InlineModelAdmin类上定义内联)。Django admin自带两种嵌套方式TabularInline和StackedInline,用于在父模型的编辑页面中以表格形式显示关联的子模型对象。
一、安装
pip install django-nested-admin
二、配置
- 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