python教程—Django管理—内联内联(或者,同时编辑三个模型)-Python实用宝典

python教程—Django管理—内联内联(或者,同时编辑三个模型)

我有一组看起来像这样的模型:和一个看起来像这样的admin.py:我的目标是得到一个管理界面,让我可以在一个页面上编辑所有内容。这个模型结构的最终结果是生成了一个视图+模板,看起来或多或少像:

我有一组这样的模型:

    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

(这是我刚想到的,还没有经过测试,但它应该能让你朝着正确的方向前进。)

您的模板只需要呈现表单和表单。link_formset适当。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
3

发表评论