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

0dxa2lsx  于 2023-02-14  发布在  Go
关注(0)|答案(6)|浏览(120)

在我的django应用中,我希望能够为我的一些模型添加自定义的帮助文本到管理更改表单中。注意我不是在谈论我可以在单个字段上设置的特定于字段的help_text属性。例如,在My_AppMy_Model的更改表单顶部,我希望能够添加一些HTML,内容为“有关我的模型的附加信息,参见http://example.com“,以便提供指向内部文档wiki的链接。
有什么简单的方法可以完成这个任务吗?或者我需要为模型创建一个自定义的管理表单吗?如果有,你能给予我一个我会怎么做的例子吗?

pgpifvop

pgpifvop1#

使用管理员的字段集:

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...

你可以在一个admin中有多个字段集。每个字段集都可以有自己的标题(用标题替换上面的None)。你也可以将'classes': ('collapse',),添加到一个字段集中,使它开始时处于折叠状态(wide类使数据字段变宽,其他类名表示CSS所指示的任何内容)。
注意:description字符串被认为是安全的,所以不要在里面放任何未经清理的数据。这样做是为了你可以在需要的时候放标记(比如你的链接),但是块格式(比如<ul>列表)可能看起来不对。

30byixjq

30byixjq2#

有一种相当简单但缺乏文献记载的方法可以实现这一点。

在Admin类中定义render_change_form

首先,你需要传递额外的上下文给你的admin。要做到这一点,你可以在你的admin类中定义一个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().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

ztmd8pv5

ztmd8pv53#

除了可以创建带有描述的字段集之外,您还可以覆盖管理员的变更表单模板。

c2e8gylq

c2e8gylq4#

如果我明白你想要什么下面的代码应该做你想要的。

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

k4emjkb1

k4emjkb15#

作为对这个问题的更新,您可以使用help_text在模型中执行此操作
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.help_text

tsm1rwdh

tsm1rwdh6#

从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

相关问题