4

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

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

谢谢,丹尼

4

2 回答 2

3

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

我破解了 fieldset.html 以包含以下内容:

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

这样字段集标签标签不会出现在“约束”字段中,但不受影响。

不要在家里尝试这个...

于 2013-07-15T15:57:22.903 回答
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)。

于 2013-07-15T14:34:16.540 回答