2013-07-11 36 views
4

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

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='' 

的问题是,只读字段的定义admin根本不会显示在modelform字段中。

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

感谢, 丹尼

回答

0

管理形式动态地从元类创建add_view或change_view被调用时(参见django/contrib/admin/options.pyadminForm变量)。

因此最简单的解决方法是将None到字段集的标签:

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

但你:

class ObservableAdmin(MPTTModelAdmin): 

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

另外,您可以使用属性verbose_name在模型中的字段声明设置的空标签无法消除标签后缀(':'),因为在代码中已修复(django/contrib/admin/helpers.py)。

我更喜欢第一种解决方案(如果您想用collapse将其隐藏起来,则需要使用适当的标签)。

+0

感谢您的回复,但我不相信这些回应对我而言都适用。第一种方法隐藏字段集标签,但仍显示该字段的“约束:”标签。这与我想要的完全相反,即隐藏“约束:”标签并显示字段集标签。 第二个解决方案做我想要的,除了你提到的“:”,但这里的问题是我需要其他形式的约束。我想我可以在所有这些标签中改变标签,这样毕竟可以工作。 –

3

我想出了一个真正丑陋的变通方法,我想要做什么......

我砍死fieldset.html包括以下内容:

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

这样的字段集标签标记不会出现为约束字段,但在其他方面不受影响。

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