在django admin fieldset readonly字段中隐藏标签

时间:2013-07-11 22:19:04

标签: django django-admin

我有一个非常恼人的问题,如果该字段是只读的,我无法在管理员中隐藏标签:

class Observable(Model):
    constraints=ManyToManyField('Constraint')

class ObservableAdmin(MPTTModelAdmin):

    form=ObservableAdminForm
    fieldsets =[('other fields',{}),
                ('All Constraints...:', {'fields':('constraints',)}),] 
    readonly_fields = ['constraints'] # I want to hide the "Constraints: " label

class ObservableAdminForm(ModelForm):

    class Meta:
    model=Observable
    fields=('parent', 'name', 'alias', 'comments', 'constraints')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
       # CAN'T DO self.fields['constraints'].label=''

问题是管理员中定义的只读字段根本不会显示在模型字段中。

django管理员正确地将约束显示为逗号分隔的文本块,但它显示了“约束”标签,该标签在字段集中与“所有约束...”是多余的。有人可以建议解决方法吗?

感谢, 丹尼

2 个答案:

答案 0 :(得分:3)

我想出了一个真正丑陋的解决方法,可以做我想要的......

我攻击了fieldset.html以包含以下内容:

{% if field.label_tag != "<label>Constraints:</label>" %}
  {{ field.label_tag }}
{% endif %}

因此,“约束”字段不显示字段集标签标记,但不受其影响。

不要在家里试试......

答案 1 :(得分:0)

当调用add_view或change_view时,会从元类动态创建管理表单(请参阅adminForm中的django/contrib/admin/options.py变量)。

所以最简单的解决方法是将None放入fieldset的标签:

class ObservableAdmin(MPTTModelAdmin):

    form=ObservableAdminForm
    fieldsets =[('other fields',{}),
                (None, {'fields':('constraints',)}),] 
    readonly_fields = ['constraints'] # I want to hide the "Constraints: " label

或者,您可以使用模型的字段声明中的属性verbose_name设置空标签:

class Observable(Model):
    constraints=ManyToManyField('Constraint', verbose_name='')

但是你无法消除标签后缀(':'),因为它已在代码(django/contrib/admin/helpers.py)中修复。

如果可行,我更喜欢第一个解决方案(如果你想用collapse隐藏它,那么字段集需要一个合适的标签。)