每个型号多个图像

时间:2009-02-11 16:26:07

标签: django django-models

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

所以说,我的选择是什么?

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

  2. 是否有像django.contrib.comments这样的应用为我完成这项工作?

  3. 如果我必须自己编写,我将如何使管理员方面体面?我想象的东西比ImageField提供的东西要漂亮得多,还有一些重新排序的拖延。但是我在撰写管理页面时非常熟悉=(

3 个答案:

答案 0 :(得分:110)

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

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

  3. 管理站点不能成为“用户证明”,只能由受信任的用户使用。鉴于此,让您的管理网站变得像样的方法是为您的属性定义ModelAdmin,然后内联照片(inline documentation)。

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

    # 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的代码段Orderable inlines using drag and drop with jQuery UI

    在管理员中实施拖放式排序

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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