【问题标题】:Render image to a choice/char field in Django admin将图像渲染到 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”文本而是图像本身。

这是它目前的样子:

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

【问题讨论】:

    标签: django django-models django-forms django-templates django-admin


    【解决方案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%,但经过很少的修改,结果证明它不仅仅是一个体面的解决方法。因为这个事实,我会接受这个答案。
    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2012-02-25
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多