我有一个非常恼人的问题,如果该字段是只读的,我无法在管理员中隐藏标签:
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管理员正确地将约束显示为逗号分隔的文本块,但它显示了“约束”标签,该标签在字段集中与“所有约束...”是多余的。有人可以建议解决方法吗?
感谢, 丹尼
答案 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
隐藏它,那么字段集需要一个合适的标签。)