我有多个管理站点,因此不同的用户可以获得编辑数据库中对象的不同体验。每个管理站点都有一组不同的对象,以及不同的样式。所有这些都可以通过覆盖模板和ModelAdmin对象来完成。
我无法弄清楚如何通过不同的网站提供不同的help_text。 help_text总是直接从模型字段定义中获取,似乎没有办法覆盖它。
我错过了什么,或者这是不可能的?
答案 0 :(得分:12)
您可以创建一个新的模型表单并覆盖那里的help_text:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['myfield'].help_text = 'New help text!'
然后在ModelAdmin中使用新表单:
class MyModel(admin.ModelAdmin):
...
form = MyForm
这是实现所需内容的更简洁方法,因为表单字段无论如何都属于表单!
答案 1 :(得分:5)
在Django 1.9中,类似于以下内容适用于我
def get_form(self, request, obj=None, **kwargs):
form = super(MyAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['my_field'].help_text = """
Some helpful text
"""
return form
答案 2 :(得分:1)
Cerin是对的,但他的代码效果不佳(至少在Django 1.4中)。
def get_readonly_fields(self, request, obj):
try:
field = [f for f in obj._meta.fields if f.name == 'author']
if len(field) > 0:
field = field[0]
field.help_text = 'some special help text'
except:
pass
return self.readonly_fields
您必须更改“作者”和help_text
字符串才能满足您的需求。
答案 3 :(得分:1)
另一种方法是将help_texts
关键字传递给get_form
方法,如下所示:
def get_form(self, request, obj=None, **kwargs):
help_texts = {'my_field': 'Field explanation'}
kwargs.update({'help_texts': help_texts})
return super(FooAdmin, self).get_form(request, obj, **kwargs)
help_texts
关键字最终会传递给modelform_factory
方法,并作为Django管理员模型中的标准帮助文本呈现。
如果您使用InlineModelAdmin
,则需要以相同的方式覆盖get_formset
。
如果您的ModelAdmin子类中有readonly_fields
,这也有效。
答案 4 :(得分:1)
如果您仅在 admin.py
中定义了自定义字段,而该字段不在您的模型中,那么您可以使用自定义 help_text
的 class Meta
添加 ModelForm
1}}:
(例如:您想在表单上添加用户照片,您可以定义自定义 html img
标签 like this)。
class SomeModelForm(forms.ModelForm):
# You don't need to define a custom form field or setup __init__()
class Meta:
model = SomeModel
help_texts = {"avatar": "User's avatar Image"}
# And tell your admin.py to use the ModelForm:
class SomeModelAdmin(admin.ModelAdmin):
form = SomeModelForm
# ... rest of the code
答案 5 :(得分:0)
您始终可以在ModelAdmin构造函数中更改表单字段属性,例如:
def __init__(self, *args, **kwargs): super(ClassName, self).__init__(*args, **kwargs) if siteA: help_text = "foo" else: help_text = "bar" self.form.fields["field_name"].help_text = help_text
答案 6 :(得分:-1)
试试这个(可能需要用self.form.fields替换self.fields ......)
class PropertyForm(models.ModelAdmin):
class Meta:
model = Property
def __init__(self, *args, **kwargs):
super(PropertyForm, self).__init__(*args, **kwargs)
for (key, val) in self.fields.iteritems():
self.fields[key].help_text = 'what_u_want'