【问题标题】:How can I limit ImageField to a few choices in Django Admin如何将 ImageField 限制为 Django Admin 中的几个选项
【发布时间】:2019-03-24 10:52:21
【问题描述】:

我有一个类似文件的模型

models.ImageField(upload_to='folder_icons', null=True)

我希望能够将此图标的选择限制为几个预先创建的选择。

我可以向用户(员工)显示 django 管理员中的选择,也许是在一个下拉列表中?

这类似于我想要一个字段,您可以在其中选择几个不同的头像。是否有自定义字段可以做到这一点?

谢谢

【问题讨论】:

    标签: django django-forms django-admin


    【解决方案1】:

    作为一个起点,您需要重写 ModelAdmin.get_form() 方法,这将允许您更改 Django 默认为您的 image 字段使用的输入字段的类型。它应该是这样的:

    from django.forms import Select
    
    class YourModelAdmin(admin.ModelAdmin):
        def get_form(self, request, obj=None, **kwargs):
            # 1. Get the form from the parent class:
            form = super(YourModelAdmin, self).get_form(request, obj, **kwargs)
            # 2. Change the widget:
            form.base_fields['your_image_field'].widget = Select(choices=(
                ('', 'No Image'),
                ('path/to/image1.jpg', 'Image 1'),
                ('path/to/image2.jpg, 'Image 2'),
            ))
    
            # 3. Return the form!
            return form
    

    您仍然需要考虑其他一些因素 - 例如,图像本身的路径/位置(将它们放在 settings.MEDIA_ROOT 中可能是最简单的,或者至少是尝试完成这项工作的第一步)。我还可以想象您可能想要更复杂地展示该字段,以便显示实际图像的缩略图(请参阅@Cheche's answer where he suggests select2 - 不过这会变得有点复杂,因为您需要制作自定义小部件)。

    综上所述,就仅更改管理员使用的表单字段以提供下拉/选择字段而不是文件上传字段而言,这就是您实现这一目标的方式。

    【讨论】:

    • 谢谢。图像字段小部件是否应该不期望图像数据而不是图像路径的字符串?提交时我收到“没有提交文件。请检查表单上的编码类型。”
    • 你知道 - 这是我的回答的问题。对您的问题进行更多思考后,我觉得您可能应该只使用一个选择字段,而 不是 一个图像字段。图像字段是专门为提供文件保存功能而设计的,这并不是您真正需要的——您已经将文件上传到您的服务器,您只希望您的管理员能够从预定义的列表中进行选择选择。在这种情况下,您需要使用 models.CharField 和选项 kwarg(请参阅 docs.djangoproject.com/en/2.1/ref/models/fields/#choices)。
    • 我最后做到了。我更改为 char 字段,还添加了另一个动态属性,将 char 字符串显示为图像。谢谢
    • 你打赌!很高兴这成功了,恭喜/很好地展示了图像 - 做这样的事情的能力是我喜欢 Django 的地方,一旦你开始在引擎盖下四处寻找,它真的很灵活,可以这么说。
    【解决方案2】:

    您需要的是widget 来呈现您的选择。您可以尝试使用select2 或任何适应此的django,例如django-select2。检查this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2012-02-08
      • 2021-10-10
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多