53

次のような一連のモデルがあります。

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

私の目標は、1 つのページですべてを編集できる管理インターフェイスを取得することです。このモデル構造の最終結果は、多かれ少なかれ次のように見えるビュー + テンプレートに生成されることです。

<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 admin で inline-in-in-in-inline トリックが失敗することはわかっています。この種の 3 レベルのモデル編集を許可する方法を知っている人はいますか? 前もって感謝します。

4

4 に答える 4

22

You need to create a custom form and template for the LinkSectionInline.

Something like this should work for the form:

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

(That just came off the top of my head and isn't tested, but it should get you going in the right direction.)

Your template just needs to render the form and form.link_formset appropriately.

于 2009-08-26T05:18:15.580 に答える
1

私のお勧めは、実際にはモデルを変更することです。ForeignKeyにインLinkを持っていないのはなぜLinkSectionですか?または、OneToMany でない場合は、おそらくManyToManyフィールドですか? 管理インターフェイスはそれを無料で生成します。もちろん、リンクがリンク セクションと論理的に関係がない場合はお勧めしませんが、関係があるのでしょうか? そうでない場合は、意図された組織が何であるかを説明してください。(たとえば、セクションあたり 3 つのリンクは固定ですか、任意ですか?)

于 2009-04-04T14:05:51.500 に答える
0

インライン フィールド自体を使用できる、TabularInline または StackedInline と同様の新しいクラスを作成できます。

または、モデル専用の新しい管理テンプレートを作成することもできます。しかし、もちろん、それは管理インターフェースの気の利いた機能を無効にします.

于 2009-08-25T17:29:16.367 に答える