【问题标题】:Django Admin: Add text at runtime next to a fieldDjango Admin:在运行时在字段旁边添加文本
【发布时间】:2011-06-10 08:59:57
【问题描述】:

我想在 django 管理界面的一个字段旁边添加一个文本。

警告需要在运行时在 python 方法中创建。我很了解 python 和 django ORM,但我不知道如何获取字段旁边的文本。

文本应该是警告。在 clean() 中提高 ValidationError 不是解决方案,因为 用户不能再编辑页面。这应该只是一条警告信息。

【问题讨论】:

  • 你想在 django admin 中显示的列表中添加文本吗?例如 model.text 值和其他一些文本?
  • 我想要 change_form(在编辑模型实例上)页面中的警告。

标签: django django-admin


【解决方案1】:

您可以为管理员使用自定义ModelForm 子类,在初始化时为相关字段添加help_text 属性,并对其进行适当的样式设置。

# forms.py

class YourModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['field_in_question'].help_text = generate_warning()

# admin.py

class YourModelAdmin(admin.ModelAdmin):
    form = forms.YourModelForm

    # And here you can specify custom CSS / JS which would make
    # `help_text` for that particular field look like a warning.
    # Or you can make it generic--say, style (and maybe reposition w/js) all tags
    # like <span class="warning"> that occur within the help text of any field.

    class Media:
        css = {"all": ("admin_warning.css", )}
        js = ("admin_warning.js", )

【讨论】:

  • 谢谢。我在 help_text 上设置了一个带有类 errornote 的 div 并得到了我想要的。
  • 构造函数中的一个下划线过多。
【解决方案2】:

如果你想在更改列表视图中执行此操作,你可以写在模型方法中,它以你想要的格式返回字符串,并将该方法的名称放在 admin 的 list_display 中。

class MyModel(models.Model):
    myfield = models.CharField(max_length=100)

    def myfield_with_warning(self):
       return '%s - %s' % (self.myfield, '<span class="warn">My warning message</p>'
    myfield_with_warning.short_description = 'My field verbose name'
    myfield_with_warning.allow_tags = True

class MyModelAdmin(models.ModelAdmin):
    list_display = ('myfield_with_warning',)

如果不是您需要的,请更准确地写出您要在哪里显示警告消息。

【讨论】:

    【解决方案3】:

    我认为最简单的方法是覆盖该模型的特定管理页面。这在 Django 文档中描述为here。您需要覆盖的模板可能是change_form.html。在这些模板中显示的对象在模板变量original 中可用。

    我会为您的模型添加一个方法或属性,它会生成并返回错误消息并从模板中调用此方法。

    编辑:看看contrib/admin/templates/admin/change_form.html 有一个包含includes/fieldset.html,它显示了管理站点的字段。您可以在其中放置一些代码来检查模型是否具有某些特殊的命名属性,如果是则显示。您可以让他们简单地使用您的自定义模型覆盖所有模型的 change_form.html

    【讨论】:

    • “场边”部分对我来说很重要。使用您建议的解决方案在页面顶部添加一些消息非常容易。但我想在输入字段旁边收到警告。用 css+js 把它移到那里不是一个解决方案。
    • 我在“includes/fieldset.html”中找不到可以覆盖的块。我不想复制整个 fieldset.html 文件,只是为了修改一行。我想自己的 ModelAdminForm 更好。
    猜你喜欢
    • 1970-01-01
    • 2022-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多