Django管理界面:在字段旁动态添加文本

5

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

警告需要在python方法中动态创建。我很熟悉python和django ORM,但不知道如何获取字段旁边的文本。

文本应该是一个警告。在clean()中引发ValidationError不是解决方案,因为用户无法再编辑页面。它应该只是一个警告消息。


你想在 Django 管理界面中的列表中添加文本吗?例如,模型的 text 值和其他一些文本? - Mohammad Efazati
我想在更改表单(编辑模型实例)页面上看到警告。 - guettli
3个回答

7
您可以使用自定义的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上设置了一个class为errornote的div,得到了我想要的结果。 - guettli
1
构造函数中下划线多了一个。 - Arahman

0

如果您想在变更列表视图中实现此功能,可以编写模型方法,该方法返回您想要的格式的字符串,并将该方法的名称放入管理界面的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',)

如果这不是你需要的,请更加精确地描述,你想在哪里显示警告信息。

0

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

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

编辑:看一下contrib/admin/templates/admin/change_form.html,其中包含includes/fieldset.html的引用,用于显示管理站点的字段。您可以在那里放置一些代码来检查模型是否具有某些特殊命名的属性,如果有,则显示该属性。然后,您可以为所有模型简单地覆盖带有自定义模型的change_form.html


“next to the field” 这部分对我很重要。使用您提出的解决方案,在页面顶部添加一些消息非常容易。但是我想在输入字段旁边显示警告。使用css+js将其移动到那里不是一个解决方案。 - guettli
我找不到可以覆盖'includes/fieldset.html'中的块。我不想复制整个 fieldset.html 文件,只是想修改一行代码。我想一个自己的 ModelAdminForm 更好。 - guettli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接