将模型范围的帮助文本添加到django模型的管理表单中

时间:2010-09-16 16:20:21

标签: python django django-models django-admin

在我的django应用程序中,我希望能够为我的某些模型添加自定义帮助文本到管理员更改表单。注意我不是在谈论我可以在各个字段上设置的字段特定help_text属性。例如,在My_ModelMy_App的更改表单的顶部,我希望能够添加一些HTML,其中显示“有关我的模型的其他信息,请参阅http://example.com”为了提供内部文档维基的链接。

有没有简单的方法来实现这一点,还是我需要为模型创建自定义管理表单?如果是这样,你能举个例子说明我会怎么做吗?

6 个答案:

答案 0 :(得分:61)

使用管理员fieldsets

class MyAdmin(admin.ModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('first', 'second', 'etc'),
            'description': "This is a set of fields group into a fieldset."
        }),
    )
    # Other admin settings go here...

您可以在管理员中拥有多个字段集。每个都可以有自己的标题(用标题替换上面的None)。您还可以将'classes': ('collapse',),添加到字段集以使其开始折叠(wide类使数据字段更宽,其他类名称表示他们所说的任何内容)。

注意:description字符串被视为安全,因此请勿在其中放置任何未清除的数据。这样做就可以根据需要将标记放在那里(比如链接),但是,块格式化(如<ul>列表)可能看起来不对。

答案 1 :(得分:28)

有一种相当简单但未充分记录的方法可以实现这一目标。

在Admin类

中定义render_change_form

首先,您需要将额外的上下文传递给您的管理员。为此,您可以在管理类中定义render_change_form函数,例如:

# admin.py
class CustomAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
        # here we define a custom template
        self.change_form_template = 'admin/myapp/change_form_help_text.html'
        extra = {
            'help_text': "This is a help message. Good luck filling out the form."
        }

        context.update(extra)
        return super(CustomAdmin, self).render_change_form(request,
            context, *args, **kwargs)

创建自定义模板

接下来,您需要创建该自定义模板(change_form_help_text.html)并扩展默认的“admin / change_form.html”。

# change_form_help_text.html
{% extends 'admin/change_form.html' %}
{% block form_top %} 
{% if help_text %}<p>{{ help_text }}</p>{% endif %}
{% endblock %}

我选择将此模板放在templates / admin / myapp /中,但这也很灵活。


更多信息,请访问:

http://davidmburke.com/2010/05/24/django-hack-adding-extra-data-to-admin-interface/

http://code.djangoproject.com/wiki/NewformsHOWTO#Q:HowcanIpassextracontextvariablesintomyaddandchangeviews

答案 2 :(得分:2)

如果我理解你想要什么,下面的代码应该做你想要的。

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

这是使用某些逻辑来修改覆盖表单的示例。所以你只需将它放在你覆盖的ModelAdmin构造函数中。

答案 3 :(得分:1)

答案 4 :(得分:0)

自django 3.0起,现在可以更轻松地覆盖help_text

from django.utils.translation import gettext_lazy as _

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        labels = {
            'name': _('Writer'),
        }
        help_texts = {
            'name': _('Some useful help text.'),
        }
        error_messages = {
            'name': {
                'max_length': _("This writer's name is too long."),
            },
        }

https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/#overriding-the-default-fields

答案 5 :(得分:-4)

就像这个问题的更新一样。您可以使用help_text

在模型中执行此操作

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.help_text