1

私は表形式のインラインでDjango管理者にフォームを持っています:

class MemberAdminInline(admin.TabularInline):
    model = Member
    fields = ("first_name", "last_name")
    readonly_fields = ("first_name", )

class GroupAdmin(admin.ModelAdmin):
    model = Group
    fields = ("name", "description")
    inlines = [MemberAdminInline]

条件付きでMember'sを表示したいと思いlast_nameます。いえ

"If first_name = "Joe": don't display show field for last_name".

フィールドを表示せず、非表示にしないことが重要です (たとえば、JS を使用)。実際の作業シナリオでは、このフィールドには、フォームを通過したときに壊れるバイナリ データが含まれる場合があるためです。last_nameつまり、特定first_nameの sに対してのみ管理者から編集できるようにしたいのです。

インライン用のカスタムフォームを提供し、そこから条件付きでフィールドを削除するか、readonly_fieldsさまざまな段階でリストにフィールドを動的に含めようとしましたが、Django は常にフィールドを非表示にしたいフィールドを見つけようとしました。

ジャンゴ 1.3.1

4

1 に答える 1

2

Django はインライン作成時にフォームセットのフィールドのリストを計算し、フォームセットはこれらのフィールドが存在することを主張しているようです。

したがって、私が見つけたこれを克服する唯一の方法は、必要に応じて保存された値を実際に無視することです。

class MemberAdminInlineForm(forms.ModelForm):
    def clean_last_name(self):
        if hasattr(self, "instance"):
            if self.instance.first_name == "Joe":
                return self.instance.last_name
        return self.cleaned_data["last_name"].

class MemberAdminInline(admin.TabularInline):
    model = Member
    fields = ("first_name", "last_name")
    readonly_fields = ("first_name", )
    form = MemberAdminInlineForm
于 2012-08-29T12:33:43.783 に答える