【问题标题】:How to bind an image to an edit form in Django?如何将图像绑定到 Django 中的编辑表单?
【发布时间】:2011-01-12 23:36:38
【问题描述】:

我有以下型号:

class Listing(models.Model):
    name = models.CharField(max_length=50, verbose_name="Title")
    images = models.ManyToManyField('Image')

ManyToManyField 链接到这个 Image 类:

class Image(models.Model):
    thumb = ImageField(upload_to='images/uploads/')
    number = models.PositiveSmallIntegerField()

以及对应的ModelForm,如下所示:

class ListingEditForm(ModelForm):
    image1 = ImageField(required=False, label="Photo 1")
    image2 = ImageField(required=False, label="Photo 2")
    image3 = ImageField(required=False, label="Photo 3")

    class Meta:
        model = Listing
        exclude = ('images')

想法是不限制后端可以与Listing关联的图像数量,但此时我只需要表单中的3张图像。上传图片可以正常工作,但是如何将表单绑定到 Listing 实例,以便在查看编辑表单时图片不是“无”?

显然,仅此一项是行不通的,因为 image1image2image3 只是表单字段,而不是模型的一部分:

form = forms.ListingEditForm(instance=listing)

所以添加字典作为第一个参数似乎是显而易见的事情:

form = forms.ListingEditForm({'image1': ...},instance=listing)

但是... 的值应该是多少?以及如何从Listing 实例中检索它?

【问题讨论】:

    标签: django django-forms django-models


    【解决方案1】:

    我会回答我自己的问题,尽管这不是我想要的答案。我环顾四周,据我所知,在 HTML 中没有可靠的方法来更改文件输入字段的内容。所以,我可能是错的,但即使您在请求中发送该信息,Django 也无法在该字段中显示该信息(因为它与本地 PC 上的文件不对应)。

    所以,我的解决方案是简单地将图片的网址与请求一起发送,就像通常那样:

    return render_to_response('edit.html', {'image1': image1_url, ...})
    

    然后,如果此信息存在,我使用 jQuery 将图像放置在模板中的文件输入字段旁边,并在用户选择新文件时更新它。这不是最好的,但它有效。

    我仍然很高兴听到任何其他解决方案。

    【讨论】:

      【解决方案2】:

      我会在 Image 中使用外键关系,并使用 inlineformset_factory 来生成表单。

      ListingEditForm = inlineformset_factory(Listing, Image, max_num=3, extra=0)

      我还会在图像模型中添加图像名称字段。这样,用户将在表单显示中显示上传的文件,如果他愿意,他也可以删除图像。如果您需要无限上传,只需将 max_num 更改为 0,将 extra 更改为 1。

      当然,这样你不能将一张图片与一个以上的列表对象相关联,但如果你需要用户能够删除无论如何都不推荐的图片。

      【讨论】:

        猜你喜欢
        • 2011-05-14
        • 1970-01-01
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多