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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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】:

除了可以创建fieldsets with descriptions,您还可以创建override the admin's template for the change form。

【讨论】:

我也在写那个,但很快就失控了。问题不在于覆盖管理模板,而是从模型获取额外的每个模型信息到模板,看起来你必须覆盖管理 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

【讨论】:

以上是关于将模型范围的帮助文本添加到 django 模型的管理表单的主要内容,如果未能解决你的问题,请参考以下文章

如何将标签添加到Django管理员字段

如何在将密码保存到用户模型 Django 之前对其进行加密?

在创建两个模型后,在两个模型之间创建关系。 (Python,Django,SQLite)

Django 将括号添加到 Django 模型字段

Django:将字段添加到模型表单集

如何将计算字段添加到 Django 模型