如何在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即可
当然,通过这种方式,您不能将一个图像与多个列表对象相关联,但如果您需要用户能够删除不推荐的图像