4

私は3つのモデルを持っています:

class Top(models.Model):
    toptitle = models.CharField(max_length=255, verbose_name='top title')

class Middle(models.Model):
    top = models.ForeignKey(Top)
    middletitle = models.CharField(max_length=255, verbose_name='middle title')
    importantfield1 = models.TextField(verbose_name='important field 1')
    importantfield2 = models.TextField(verbose_name='important field 2')
    ...
    importantfield20 = models.TextField(verbose_name='important field 20')

トップの管理ページを表示しているときに、それに関連するミドルを確認したい (このページまたはこのページのリンクからミドルを追加および編集できるようにする)。

インラインで十分に簡単に行うことができます。問題は、Middle に非常に多くの (必須) フィールドがあると扱いにくくなることです。

インラインがミドルタイトルのみを表示するように指定した場合

class MiddleInline(admin.TabularInline):
    model = MiddleInline
    fields = ('middletitle',)
    extra = 0

2 つの問題があります。1 つ目は、既に存在するミドルのすべてのフィールドを編集できるページにアクセスする方法がないことです ([管理] メニューに移動して [ミドル] を選択し、そこで適切なミドルを見つける必要はありません)。 . 2 つ目の問題は、このインラインから別のミドルを追加しようとすると、ミドルタイトルだけでミドルを作成できるが、必要な重要フィールドがすべて空のままになることです。

オブジェクトを編集するためのリンクを追加することで、最初の問題に対処できました。

class MiddleInline(admin.TabularInline):
    def changeform_link(self,instance):
        if instance.id:
            changeform_url = reverse(
                'admin:myapp_middle_change', args=(instance.id,)
            )
            return '<a href="'+ changeform_url + '" target="_blank">Details</a>'
        return ''
    changeform_link.allow_tags = True
    changeform_link.short_description = ''   # omit column header

    model = MiddleInline
    fields = ('middletitle','changeform_link')
    extra = 0

しかし、今では2番目の問題に対処する方法がわかりません。

理想的には、「別のミドルを追加」セクションで、新しいミドルを作成するためのポップアップを開いて(トップがすでに設定されており、すべての重要なフィールドを持っている/必要としている)、保存するとインラインが更新されるようにしたいと思います。

これを行う方法はありますか?私はこれに完全に間違っていますか?

4

1 に答える 1

0

私は多少同じ問題を抱えていたと確信しています。私の解決策は、2 つの異なる状況に対して 2 つの異なるフィールドセットを表示することでした。

ModelAdminクラスには、ファイルでオーバーライドする関数get_fieldsets(self,request, obj=None)がありadmin.pyます。

次のようなもの:

class MiddleInline(admin.TabularInline):
    '''your stuff'''

    def get_fieldsets(self, request, obj=None):
        if obj is None:
            fields = list(('''tuple of the fields you want to display if it's a new object'''))
        else:
            fields = list(('''tuple of the fields you want to display if it's not a new object'''))
        return [(None, {'fields': fields})]

あなたの質問が正しかったかどうかは完全にはわかりませんが、これがお役に立てば幸いです。

于 2013-11-18T21:33:55.780 に答える