在 django admin fieldset 只读字段中隐藏标签

问题描述 投票:0回答:3

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

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

谢谢, 丹尼

django django-admin
3个回答
3
投票

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

我修改了 fieldset.html 以包含以下内容:

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

这样字段集标签不会出现在 Constraints 字段中,但不受影响。

不要在家尝试这个...


0
投票

当调用 add_view 或 change_view 时,管理表单是从元类动态创建的(请参阅

adminForm
中的
django/contrib/admin/options.py
变量)。

所以最简单的解决方法是将

None
放入字段集的标签中:

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
隐藏字段集,则需要为字段集提供适当的标签)。


0
投票

当然,覆盖

django/contrib/admin/templates/admin/includes/fieldset.html
是您的首选,您可以对页面元素进行完整灵活的控制。

但是如果不方便修改html文件。您可以使用 Monkey Patching 更改只读字段

label_tag
函数来控制 html 标签返回的内容。

此外,我不太确定你想隐藏字段集标题或字段标签吗?因为 Davide Brunato 的答案是隐藏字段集的标题。

我的解决方案是覆盖

AdminReadonlyField.label_tag

# admin.py
from django.contrib.admin.helpers import AdminReadonlyField

old_label_tag = AdminReadonlyField.label_tag

def label_tag(self):
    hide_label = ['Constraint']
    if self.field['name'] in hide_label:
        return format_html('')
    else:
        return old_label_tag(self)

AdminReadonlyField.label_tag = label_tag
© www.soinside.com 2019 - 2024. All rights reserved.