【问题标题】:Adding model-wide help text to a django model's admin form将模型范围的帮助文本添加到 django 模型的管理表单
【发布时间】:2011-04-13 07:39:15
【问题描述】:

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

是否有任何简单的方法可以完成此操作,或者我是否需要为模型创建自定义管理表单?如果是这样,你能举个例子说明我会怎么做吗?

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    使用管理员的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 类使数据字段更宽,而其他类名表示您的 CSS 所说的任何内容)。

    小心:description 字符串被认为是安全,所以不要在其中放入任何未清理的数据。这样做是为了让您可以根据需要在其中添加标记(例如您的链接),但是,块格式(例如 <ul> 列表)可能看起来不正确。

    【讨论】:

    • 恕我直言,这取决于您的应用程序是否可以接受字段集。如果是,请使用我的答案;如果没有,请使用 Andre's。
    【解决方案2】:

    【讨论】:

    • 我也在写那个,但很快就失控了。问题不在于覆盖管理模板,而是从模型获取额外的每个模型信息到模板,看起来你必须覆盖管理 view 或使用上下文处理器。
    【解决方案3】:

    有一种相当简单但未充分记录的方法来完成此任务。

    在 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

    【讨论】:

    • 我认为“记录不足”是慷慨的。很好的收获。
    【解决方案4】:

    如果我明白你想要什么,下面的代码应该可以满足你的需求。

    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 构造函数中。

    【讨论】:

    • 我将添加此方法用于覆盖表单
    【解决方案5】:

    就像对这个问题的更新一样。你可以在模型中使用help_text

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

    【讨论】:

    • 这是一个领域,他在问题中特别指出他不是在谈论这个。
    【解决方案6】:

    从 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

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2014-08-05
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      相关资源
      最近更新 更多