あるオブジェクトの Django 管理ページから関連オブジェクトの管理ページへのリンクを追加するにはどうすればよいですか? 質問する

あるオブジェクトの Django 管理ページから関連オブジェクトの管理ページへのリンクを追加するにはどうすればよいですか? 質問する

対処するにはネストされたインラインの欠如django-admin では、2 つのモデルの管理者変更ページとインライン管理者間のリンクを作成するために、2 つのテンプレートに特別なケースを追加しました。

私の質問は、テンプレートに厄介なハッキングを加えずに、あるモデルの管理者変更ページまたはインライン管理者から関連モデルの管理者変更ページまたはインライン管理者へのリンクをきれいに作成するにはどうすればよいかということです。

あらゆるモデルの管理者変更ページまたはインライン管理者に適用できる一般的なソリューションを希望します。


post管理ページにインラインで表示され、独自の管理ページも持つモデルが 1 つあります(実際の名前ではありません) blog。これをインラインにできない理由は、これを使用して編集した場合にのみ意味を持つ外部キーを持つモデルがあり、これを使用して編集した場合にのみ意味を持つためですblog

管理ページではpost、「fieldset.html」の一部を次のように変更しました。

{% if field.is_readonly %}
    <p>{{ field.contents }}</p>
{% else %}
    {{ field.field }}
{% endif %}

{% if field.is_readonly %}
    <p>{{ field.contents }}</p>
{% else %}
    {% ifequal field.field.name "blog" %}
        <p>{{ field.field.form.instance.blog_link|safe }}</p>
    {% else %}
        {{ field.field }}
    {% endifequal %}
{% endif %}

管理ページへのリンクを作成するにはblogblog_linkモデルのメソッドを使用します。

def blog_link(self):
      return '<a href="%s">%s</a>' % (reverse("admin:myblog_blog_change",  
                                        args=(self.blog.id,)), escape(self.blog))

idインスタンスの をblog外部のどこにも見つけることができませんでしたfield.field.form.instance

blog管理ページのpostインラインで、「stacked.html」の一部を次のように変更しました。

<h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;
<span class="inline_label">{% if inline_admin_form.original %}
    {{ inline_admin_form.original }}
{% else %}#{{ forloop.counter }}{% endif %}</span>

<h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b>&nbsp;
<span class="inline_label">{% if inline_admin_form.original %}
    {% ifequal inline_admin_formset.opts.verbose_name "post" %}
    <a href="/admin/myblog/post/{{ inline_admin_form.pk_field.field.value }}/">
            {{ inline_admin_form.original }}</a>
{% else %}{{ inline_admin_form.original }}{% endifequal %}
{% else %}#{{ forloop.counter }}{% endif %}</span>

ここで外部キー フィールドに保存されているpostものを見つけることができたので、管理ページへのリンクを作成します。id


同じことを繰り返さずに管理フォームにリンクを追加する、より優れた、より一般的な方法があるはずですが、それは何でしょうか?

ベストアンサー1

Django 1.8 の新機能:インライン管理者の show_change_link

セット変更リンクを表示真実(デフォルトでは False) をインライン モデルに追加して、インライン オブジェクトに変更フォームへのリンクを設定します (変更フォームには独自のインラインを設定できます)。

from django.contrib import admin

class PostInline(admin.StackedInline):
    model = Post
    show_change_link = True
    ...

class BlogAdmin(admin.ModelAdmin):
    inlines = [PostInline]
    ...

class ImageInline(admin.StackedInline):
    # Assume Image model has foreign key to Post
    model = Image
    show_change_link = True
    ...

class PostAdmin(admin.ModelAdmin):
    inlines = [ImageInline]
    ...

admin.site.register(Blog, BlogAdmin)
admin.site.register(Post, PostAdmin)

おすすめ記事