【问题标题】:Multiple images per Model每个模型多个图像
【发布时间】:2010-10-06 23:02:12
【问题描述】:

我正在用 Django 编写一个简单的房地产列表应用程序。每个属性都需要有可变数量的图像。图片需要有可编辑的顺序。而且我需要让管理员用户证明。

也就是说,我有什么选择?

  1. 是否有我不知道的 ImageList 字段?

  2. 有没有像django.contrib.comments 这样的应用程序可以为我完成这项工作?

  3. 如果我必须自己编写,我将如何让管理端变得体面?我正在想象一些比 ImageField 提供的更漂亮的东西,并带有一些用于重新排序的拖放操作。但是我在写管理页面时完全是个笨蛋=(

【问题讨论】:

    标签: django django-models


    【解决方案1】:
    1. 变量列表,也称为多对一关系,通常通过为多创建一个单独的模型来处理,在该模型中,使用“一”的 ForeignKey。

    2. 在 django.contrib 中没有这样的应用程序,但是您可以使用几个外部项目,例如django-photologue 甚至支持在后台查看图片。

    3. 不能将管理站点设为“用户证明”,它只能由受信任的用户使用。鉴于此,让您的管理站点体面的方法是为您的属性定义一个 ModelAdmin,然后内联照片 (inline documentation)。

    所以,给你一些快速的草稿,一切看起来像这样:

    # models.py
    class Property(models.Model):
        address = models.TextField()
        ...
    
    class PropertyImage(models.Model):
        property = models.ForeignKey(Property, related_name='images')
        image = models.ImageField()
    

    和:

    # admin.py
    class PropertyImageInline(admin.TabularInline):
        model = PropertyImage
        extra = 3
    
    class PropertyAdmin(admin.ModelAdmin):
        inlines = [ PropertyImageInline, ]
    
    admin.site.register(Property, PropertyAdmin)
    

    在 ForeignKey 上使用 related_name 参数的原因是您的查询将更具可读性,例如在这种情况下,您可以在视图中执行以下操作:

    property = Property.objects.get(pk=1)
    image_list = property.images.all()
    

    编辑:忘了提一下,然后您可以使用 Simon Willison 的 sn-p Orderable inlines using drag and drop with jQuery UI 在管理员中实现拖放排序

    【讨论】:

    • PropertyImage 模型应该包含一个用于排序的字段。
    • 谢谢,太棒了!可订购的 sn-p 在稍作更改后效果很好,因为它不是为 FileFields 编写的。第 59 行需要变成 "if ($(this).find('input[type=file]').val() || $(this).find('p.file-upload').length) {"检查它是否已经上传了文件,或者有文件等待上传。此外,它适用于 StackedInline,而不是 TabularInline(开箱即用)。
    • 如何从后台删除图片?
    • 非常感谢您的贡献!您将如何处理视图中的表单?如何在视图中“内联”照片,以便用户在添加或更新属性时上传图片?
    【解决方案2】:

    将具有 ForeignKey 的 Image 模型写入您的 Property 模型。很可能,您将拥有一些属于图像而不属于属性的其他字段。

    【讨论】:

      【解决方案3】:

      我目前正在做同样的事情,我遇到了同样的问题。

      研究了一段时间后,我决定使用django-imaging。它有一个很好的Ajax 功能,图像可以与模型插入页面在同一页面上上传,并且可以编辑。它唯一缺少的是对非 JPEG 扩展的支持。我希望我能在几天内找到解决方法。 :)

      【讨论】:

        【解决方案4】:

        有一个名为django-galleryfield 的包。我认为它会满足您的需求。

        【讨论】:

          猜你喜欢
          • 2012-03-13
          • 2022-07-13
          • 2019-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多