【问题标题】:Add link to ModelAdmin将链接添加到 ModelAdmin
【发布时间】:2016-01-15 02:43:59
【问题描述】:

我有一个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,则会导致错误。

第二个主要问题:如何添加指向其他 ModelAdmin 的链接?

【问题讨论】:

  • 我认为您没有提供足够的信息。当您将method_config 添加到list_display 时,您希望它显示什么。你想在哪里显示链接,你想链接到什么?
  • @Alasdair, method_config 应该显示一个指向尚未编写的新 ModelAdmin 的链接。
  • 取决于 object.name
  • 您希望在编辑项目时有一个表单域,还是在显示概览时只有一个链接?我还是不明白你要链接到哪个网址。

标签: django django-admin django-modeladmin


【解决方案1】:

修改self.fields 可能不是线程安全的。这意味着如果您在第一次请求时修改 self.fields,所有其他请求都将获得修改后的版本。

检查ModelAdmin.get_fields(request, obj=None) 方法以更改动态显示的字段。适用于 changeview 中的表单。如果要在更改列表视图中显示自定义字段,只需修改 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

【讨论】:

  • method_config 不是模型字段
  • 它没有显示任何东西
  • 如果你想生成特定模型视图的 url 地址,请尝试from django.core.urlresolvers import reverse reverse("admin:{{ app_label }}_{{ model_name }}_add") 检查Django admin site docs 以获取所有可用路由。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多