如何将图像绑定到Django中的编辑表单?

Her*_*aaf 5 django django-models django-forms

我有以下型号:

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

,ManyToManyField链接到这个Image类:

class Image(models.Model):
    thumb = ImageField(upload_to='images/uploads/')
    number = models.PositiveSmallIntegerField()
Run Code Online (Sandbox Code Playgroud)

和相应的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')
Run Code Online (Sandbox Code Playgroud)

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

显然,这不会单独工作,因为image1,image2image3仅表单域,而不是模型的一部分:

form = forms.ListingEditForm(instance=listing)
Run Code Online (Sandbox Code Playgroud)

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

form = forms.ListingEditForm({'image1': ...},instance=listing)
Run Code Online (Sandbox Code Playgroud)

但它的价值应该...是什么?我如何从Listing实例中检索它?

Her*_*aaf 3

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

因此,我的解决方案只是将图像的 url 与请求一起发送,就像通常那样:

return render_to_response('edit.html', {'image1': image1_url, ...})
Run Code Online (Sandbox Code Playgroud)

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

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