每个模型多张图片


71

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

这样说,我有什么选择?

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

  2. 是否有类似的应用程序django.contrib.comments对我有用?

  3. 如果我必须自己编写它,我将如何使管理端像样?我想象中的东西比ImageField提供的东西要光滑得多,并且需要一些拖放来进行重新排序。但是我在编写管理页面方面完全是笨手笨脚

Answers:


134
  1. 变量列表,也称为多对一关系,通常是通过为多个对象创建单独的模型来处理的,在该模型中,使用外键指向“一个”。

  2. django.contrib中没有这样的应用程序,但是您可以使用多个外部项目,例如django-photologue,它甚至对在管理员中查看图像提供了一些支持。

  3. 不能将管理站点设置为“用户证明”,它只能由受信任的用户使用。鉴于此,使您的管理站点更美观的方法是为您的媒体资源定义ModelAdmin,然后内联照片(内联文档)。

因此,为了给您一些快速草稿,所有内容都将如下所示:

# 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的代码段在admin中实现拖放排序,并使用jQuery UI进行拖放


1
PropertyImage模型应包含一个用于订购的字段。
akaihola

1
谢谢,太神奇了!稍作更改后,可排序代码段效果很好,因为它不是为FileFields编写的。第59行需要变成“ if($(this).find('input [type = file]')。val()|| $(this).find('p.file-upload')。length){“检查它是否已经上传了文件,或者是否有文件正在等待上传。另外,它也可以在StackedInline上,而不是在TabularInline上使用(无论如何,都是开箱即用的)。
mrooney 2012年

如何从管理员删除它的图像?
Nikita Davidenko '17

1
非常感谢您的贡献!您将如何处理视图中的表单?如何在视图中“内联”照片以便用户在添加或更新属性时上传图像?
Redjam

6

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


4

我目前正在做同样的事情,并且面临同样的问题。

经过一段时间的研究,我决定使用django-imaging。它具有出色的Ajax功能,可以将图像与模型“插入”页面上载到同一页面上,并且可以进行编辑。唯一缺少的是对非JPEG扩展的支持。我希望我能在几天内找到解决方法。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.