我有一个非常烦人的问题,如果该字段是只读的,我无法在管理中隐藏标签:
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 管理员正确地将约束显示为逗号分隔的文本块,但它显示的“约束”标签与字段集中的“所有约束...”是多余的。有人可以建议解决方法吗?
谢谢, 丹尼
我想出了一个真正丑陋的解决方法,可以满足我的要求......
我修改了 fieldset.html 以包含以下内容:
{% if field.label_tag != "<label>Constraints:</label>" %}
{{ field.label_tag }}
{% endif %}
这样字段集标签不会出现在 Constraints 字段中,但不受影响。
不要在家尝试这个...
当调用 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
隐藏字段集,则需要为字段集提供适当的标签)。
当然,覆盖
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