将图像渲染到 Django admin 中的选择/字符字段

Posted

技术标签:

【中文标题】将图像渲染到 Django admin 中的选择/字符字段【英文标题】:Render image to a choice/char field in Django admin 【发布时间】:2021-08-25 10:07:07 【问题描述】:

我的模型中有一个 CharField,如下所示:

simbol_oznaka = models.CharField(choices=CHOICES_SIMBOLI, null=True, blank=True, verbose_name="Simbol", max_length=512)

使用这样的选择元组:

CHOICES_SIMBOLI=( ('', '没有图像'), ('media/simboli/2.png', '图片 1'),).

我想知道如何在 django 管理员更改/添加表单中呈现图像,因为我不希望用户看到“图像 1”文本而是图像本身。

这是它目前的样子:

用例:我希望用户能够从几个将显示在下拉菜单(不一定是下拉菜单)中的图像中只选择一个

【问题讨论】:

【参考方案1】:

如果您真的想要选择菜单中的图像,这有点棘手,因为<option> 里面不能有<img>,我建议查看这个问题以确定您想要哪种类型的解决方案拿那个:How to add images in select list?

由于听起来好像您不一定想要下拉菜单并且只有几张图片,您或许可以改用广播组。

使用 Django 可以做到这一点的一种方法是继承 Radioselect 小部件并覆盖 option_template_name 类变量,如下所示:

from django import forms

class SimbolRadioSelect(forms.RadioSelect):
    option_template_name = 'myapp/forms/widgets/simbol_radio_option.html'

然后您需要创建option_template_name 类变量中指定的模板:

% load static %
<label% if widget.attrs.id % for=" widget.attrs.id "% endif %>
    <input type=" widget.type "
           name=" widget.name "
           value=" widget.value|stringformat:'s' "
           % include "django/forms/widgets/attrs.html" %>
    % if widget.value %
        <img src="% get_media_prefix % widget.value|stringformat:'s' ">
    % else %
         widget.label 
    % endif %
</label>

我主要是通过查看 django 源代码中的radio_option.html 和其他模板来设计这个模板的:https://github.com/django/django/tree/main/django/forms/templates/django/forms/widgets

然后你会想在你的表单中使用它(或者如果你还没有的话,创建一个):

from django import forms

class SimbolAdminForm(forms.ModelForm):
    class Meta:
        fields = '__all__'
        widgets = 
            'simbol_oznaka': SimbolRadioSelect,
        

然后你可以在你的管理类中使用表单:

from django.contrib import admin

class SimbolAdmin(admin.ModelAdmin):
    form = SimbolAdminForm

admin.site.register(Simbol, SimbolAdmin)

然后您将在管理员中结束:

【讨论】:

谢谢卢克,这正是我所做的。这不是我想要的 100%,但经过很少的修改,结果证明它不仅仅是一个体面的解决方法。因为这个事实,我会接受这个答案。

以上是关于将图像渲染到 Django admin 中的选择/字符字段的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin - 悬停时显示图像

Django 中admin添加数据并渲染主页

为啥我不能通过 admin/ 将 jpg 文件上传到我的 Django 应用程序?

使用 filerImageField 上传图片

Django简介

将 url 添加到 Django admin 中 TabularInline 中的字段