gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:30:03 24 4
gpt4 key购买 nike

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

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, ]

我的目标是获得一个管理界面,让我可以在一页上编辑所有内容。这种模型结构的最终结果是,事物被生成为一个看起来或多或少像的 View +模板:

<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 技巧失败了。有谁知道允许这种三级模型编辑的方法?提前致谢。

最佳答案

您需要创建一个自定义 formtemplate 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.link_formset。

关于python - Django admin - 内联内联(或一次编辑三个模型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/702637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com