Django admin-内联内联(或一次编辑三个模型)

我有一组看起来像这样的模型:

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管理员中失败。有人知道允许这种三级模型编辑的方法吗?提前致谢。

回答:

你需要创建一个自定义表单和模板的LinkSectionInline

像这样的东西应该适用于以下形式:

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和form.link_formset。

以上是 Django admin-内联内联(或一次编辑三个模型) 的全部内容, 来源链接: utcz.com/qa/429705.html

回到顶部