Django InlineModelAdmin: インラインモデルを部分的に表示し、完全なモデルにリンクする 質問する

Django InlineModelAdmin: インラインモデルを部分的に表示し、完全なモデルにリンクする 質問する

Journals、volumes、volume_scanInfo など、いくつかのモデルを定義しました。

ジャーナルには複数のボリュームを含めることができ、ボリュームには複数の scanInfo を含めることができます。

私がやりたいことは、

  • ジャーナルの管理ページで、巻のリストをインラインで表示したい(完了)
  • 前のリストにある各ボリュームをその管理ページに接続し、ボリュームを編集するためのフォームとその「スキャン情報」のリストをインラインで表示できるようにします。

だから私は次のようなものを望みます:

Journal #1 admin page
[name]
[publisher]
[url]
.....
list of volumes inline
    [volume 10] [..(other fields)..]   <a href="/link/to/volume/10">Full record</a>
    [volume 20] [..(other fields)..]   <a href="/link/to/volume/20">Full record</a>

それから

Volume #20 admin page
[volume number]
[..(other fields)...]
......
list of the scan info inline
    [scan info 33] [..(other fields)..]   <a href="/link/to/scaninfo/33">Full record</a>
    [scan info 44] [..(other fields)..]   <a href="/link/to/scaninfo/44">Full record</a>

私がやろうとしたのは、コードを作成するモデル メソッドを定義し、それを管理者の「ボリューム インライン」を定義するクラス内で使用しようとすることですが、機能しません。

言い換えると

モデル「Volume」の内部には次のようなものがあります:

def selflink(self):
    return '<a href="/admin/journaldb/volume/%s/">Full record</a>' % self.vid
selflink.allow_tags = True

そして

class VolumeInline(admin.TabularInline):
    fields = ['volumenumber', 'selflink']
    model = Volume
    extra = 1

しかし、次のエラーが発生します。

Exception Value: 'VolumeInline.fields' refers to field 'selflink' that is missing from the form.

何か案が?

ありがとう、ジョバンニ

ベストアンサー1

アップデート:Django 1.8 以降では、これが組み込まれています。

見るこの答えそして公式文書

古い答え:

結局、簡単な解決策を見つけました。

linked.htmlのコピーであるという新しいテンプレートを作成しtabular.html、このコードを追加してリンクを作成しました。

{% if inline_admin_form.original.pk %}
          <td class="{{ field.field.name }}">
              <a href="/admin/{{ app_label }}/{{ inline_admin_formset.opts.admin_model_path }}/{{ inline_admin_form.original.pk }}/">Full record</a>
          </td>
{% endif %}

LinkedInline次に、継承する新しいモデルを作成しましたInlineModelAdmin

#override of the InlineModelAdmin to support the link in the tabular inline
class LinkedInline(admin.options.InlineModelAdmin):
    template = "admin/linked.html"
    admin_model_path = None

    def __init__(self, *args):
        super(LinkedInline, self).__init__(*args)
        if self.admin_model_path is None:
            self.admin_model_path = self.model.__name__.lower()

LinkedInline次に、新しいインラインを定義するときに、通常の の代わりにmy を使用するだけですInlineModelAdmin

他の人にも役立つことを願っています。

ジョヴァンニ

おすすめ記事