Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中将图像绑定到编辑表单?_Django_Django Forms_Django Models - Fatal编程技术网

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

如何在Django中将图像绑定到编辑表单?,django,django-forms,django-models,Django,Django Forms,Django Models,我有以下型号: class Listing(models.Model): name = models.CharField(max_length=50, verbose_name="Title") images = models.ManyToManyField('Image') ,使用链接到此图像的ManyToManyField类: class Image(models.Model): thumb = ImageField(upload_to='images/upload

我有以下型号:

class Listing(models.Model):
    name = models.CharField(max_length=50, verbose_name="Title")
    images = models.ManyToManyField('Image')
,使用链接到此
图像的
ManyToManyField
类:

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')
这样做的目的是不限制可以与后端中的
列表关联的图像数量,但此时我只需要表单中的3个图像。上载图像效果很好,但是如何将表单绑定到
列表
实例,以便在查看编辑表单时图像不会“无”

显然,单凭这一点是行不通的,因为
image1
image2
image3
只是表单字段,而不是模型的一部分:

form = forms.ListingEditForm(instance=listing)
因此,添加字典作为第一个参数似乎是显而易见的:

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

但是,
的值应该是多少?我该如何从
列表
实例中检索它呢?

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

因此,我的解决方案就是简单地随请求一起发送图像的URL,就像通常的做法一样:

return render_to_response('edit.html', {'image1': image1_url, ...})
然后,如果存在此信息,我将使用jQuery将图像放置在模板中文件输入字段的旁边,并在用户选择新文件时进行更新。这不是最好的,但很管用


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

我会在图像中使用外键关系,并使用inlineformset\u工厂生成表单

ListingEditForm=inlineformset\u工厂(列表,图像,最大数量=3,额外数量=0)

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

当然,通过这种方式,您不能将一个图像与多个列表对象相关联,但如果您需要用户能够删除不推荐的图像