対処するにはネストされたインラインの欠如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 %}
管理ページへのリンクを作成するにはblog
、blog_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>
<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>
<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)