0

次の問題について助けが必要です。

Django admin を使用して、オブジェクトが存在するかどうかに応じて、いくつかのフィールドをインラインで非表示にしたいと考えています。

admin.ModelAdmin と同等の例:

class ClassAdmin(admin.ModelAdmin):
    ...

    def get_form(self, request, obj=None, **kwargs):
        # if inline has not been saved
        if obj is None:
            self.fieldsets[0][1]['fields'] = tuple(x for x in self.fieldsets[0][2]['fields'] if (x!='field1'))

        else:
            self.inlines = self.inlines + [ClassInline,]

            if obj.field1 == 'N':
                self.fieldsets[2][7]['fields'] = tuple(x for x in self.fieldsets[2][8]['fields'] if (x!='field10'))

        return super(ClassAdmin, self).get_form(request, obj, **kwargs)

どうすればインラインと同等にできますか?

class ClassInline(admin.StackedInline):
    # if obj:
        # display filed1, field2
    # else:
        # display filed3, field4

私は懸命に努力しましたが、問題を解決するのに役立つものは見つかりませんでした。私が見つけたいくつかのトピック:

ここここここ

誰かが仕事をすることができるコードの例を示すことができますか?

4

2 に答える 2

0

InlineModelAdmin.get_formset()現在のオブジェクト (つまり現在の親オブジェクト) をパラメーターとしてinlineformset_factory()呼び出し、 on を呼び出しself.get_fieldsets()て現在の (親) オブジェクトを渡すことにより、インラインのフォーム (実際には への呼び出し) のフィールドのリストを作成します。したがって、オーバーライドは次のInlineModelAdmin.get_formset()ようにする必要があります。

class MyInlineAdmin(admin.StackedInline):
    def get_fieldsets(self, request, obj):
        fields = super(MyInlineAdmin, self).get_fieldsets(request, obj):
        if obj and obj.pk:
            return do_something_with(fields)
        else :
            return do_something_else_with(fields)

今、あなたは「頑張って」「何も見つけられなかった」と言いますが、少なくともソースコードを見るだけで「試みました」でしたか?呼び出しチェーンと引数を理解するのに数分かかりました...

于 2015-05-13T14:34:23.510 に答える