1

私は持っていModelFormます:

class SomeModelForm(forms.ModelForm):
    class Meta:
        model = SomeModel

    def __init__(self, *args, **kwargs):
        super(ApiBackendConfigForm, self).__init__(*args, **kwargs)
        if kwargs['instance'].name == u'Some_name':
            self.fields['method_config'] = forms.URLField()

ModelAdmin:

class SomeAdmin(admin.ModelAdmin):
    form = SomeModelForm
    list_display = ('name', 'alias', 'is_enabled', )
    list_editable = ('is_enabled', )
    readonly_fields = ('name', 'alias', )

最初の質問、method_configフィールドが表示されません。にないことはわかっていますlist_displayが、 に追加するとlist_displayエラーが発生します。

そして2番目の主な質問:他のリンクを追加するにはどうすればよいModelAdminですか?

4

1 に答える 1

0

変更self.fieldsはスレッドセーフではない可能性があります。これは、最初のリクエストで self.fields を変更すると、他のすべてのリクエストがその変更されたバージョンを取得することを意味します。

その場で表示するフィールドを変更するには、ModelAdmin.get_fields(request, obj=None)メソッドを確認してください。変更ビューのフォームで動作します。変更リスト ビューでカスタム フィールドを表示する場合は、フィールドの代わりにメソッド名を使用して list_display を変更します。

例えば:

class SomeAdmin(admin.ModelAdmin):
    list_display = ('name', 'alias', 'is_enabled', 'show_method_config', )
    list_editable = ('is_enabled', )
    readonly_fields = ('name', 'alias', )

    def show_method_config(self,obj):
        return getattr(obj,"method_config","") if obj.name == u"Some_name" else ""
    show_method_config.short_description = _(u"Method config")
    show_method_config.admin_order_field = "method_config"
    show_method_config.allow_tags = True

    def get_fields(self, request, obj=None):
        fields = super(SomeAdmin, self).get_fields(request, obj)
        if obj and obj.name == u"Some_name":
            fields.append("method_config")
        return fields
于 2015-10-16T13:00:27.020 に答える