如何在django的管理界面中覆盖help_text

时间:2011-04-20 14:18:55

标签: django django-admin

我有多个管理站点,因此不同的用户可以获得编辑数据库中对象的不同体验。每个管理站点都有一组不同的对象,以及不同的样式。所有这些都可以通过覆盖模板和ModelAdmin对象来完成。

我无法弄清楚如何通过不同的网站提供不同的help_text。 help_text总是直接从模型字段定义中获取,似乎没有办法覆盖它。

我错过了什么,或者这是不可能的?

7 个答案:

答案 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_textclass 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'