我有一组看起来像这样的模型:
class Page(models.Model):
title = models.CharField(max_length=255)
class LinkSection(models.Model):
page = models.ForeignKey(Page)
title = models.CharField(max_length=255)
class Link(models.Model):
linksection = models.ForeignKey(LinkSection)
text = models.CharField(max_length=255)
url = models.URLField()
和一个看起来像这样的admin.py:
class LinkInline(admin.TabularInline):
model = Link
class LinkSectionInline(admin.TabularInline):
model = LinkSection
inlines = [ LinkInline, ]
class PageAdmin(admin.ModelAdmin):
inlines = [ LinkSectionInline, ]
我的目标是获得一个管理界面,让我可以在一个页面上编辑所有内容。这个模型结构的最终结果是,事物被生成到一个看起来或多或少的视图+模板中:
<h1>{{page.title}}</h1>
{% for ls in page.linksection_set.objects.all %}
<div>
<h2>{{ls.title}}</h2>
<ul>
{% for l in ls.link_set.objects.all %}
<li><a href="{{l.url}}">{{l.title}}</a></li>
{% endfor %}
</ul>
</div>
{% endfor %}
据我所知,我知道Django管理员中的inline-in-an-inline技巧失败了。有谁知道允许这种三级模型编辑的方法?提前谢谢。
答案 0 :(得分:21)
您需要为LinkSectionInline
创建自定义form和template。
这样的东西应该适用于表格:
LinkFormset = forms.modelformset_factory(Link)
class LinkSectionForm(forms.ModelForm):
def __init__(self, **kwargs):
super(LinkSectionForm, self).__init__(**kwargs)
self.link_formset = LinkFormset(instance=self.instance,
data=self.data or None,
prefix=self.prefix)
def is_valid(self):
return (super(LinkSectionForm, self).is_valid() and
self.link_formset.is_valid())
def save(self, commit=True):
# Supporting commit=False is another can of worms. No use dealing
# it before it's needed. (YAGNI)
assert commit == True
res = super(LinkSectionForm, self).save(commit=commit)
self.link_formset.save()
return res
(刚刚脱离我的头顶并且没有经过测试,但它应该让你朝着正确的方向前进。)
您的模板只需要适当地呈现表单和form.link_formset。
答案 1 :(得分:4)
Django-nested-inlines就是为此而建的。用法很简单。
from django.contrib import admin
from nested_inlines.admin import NestedModelAdmin, NestedStackedInline, NestedTabularInline
from models import A, B, C
class MyNestedInline(NestedTabularInline):
model = C
class MyInline(NestedStackedInline):
model = B
inlines = [MyNestedInline,]
class MyAdmin(NestedModelAdmin):
pass
admin.site.register(A, MyAdmin)
答案 2 :(得分:1)
我的建议实际上是改变你的模型。为什么ForeignKey
到Link
中没有LinkSection
?或者,如果它不是OneToMany,也许是ManyToMany
字段?管理界面将免费生成。当然,如果链接在逻辑上与链接部分没有任何关系,我不建议这样做,但也许他们这样做了?如果他们不这样做,请解释目标组织是什么。 (例如,每个部分的3个链接是固定的还是任意的?)
答案 3 :(得分:0)
您可以创建一个类似于TabularInline或StackedInline的新类,它可以使用内联字段本身。
或者,您可以创建新的管理模板,特别是您的模型。但这当然会否决管理界面的漂亮功能。