我有以下型号:
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
实例,以便在查看编辑表单时图像不是“无”?
显然,仅此一项不起作用,因为image1
,image2
和image3
只是表单字段,而不是模型的一部分:
form = forms.ListingEditForm(instance=listing)
因此,添加字典作为第一个参数似乎是显而易见的事情:
form = forms.ListingEditForm({'image1': ...},instance=listing)
但...
的价值应该是多少?我如何从Listing
实例中检索它?
答案 0 :(得分:2)
我会回答我自己的问题,即使这不是我想要的答案。我环顾四周,据我所知,HTML中没有可靠的方法来更改文件输入字段的内容。所以,我可能是错的,但即使你发送请求信息,Django也无法在该字段中显示信息(因为它与本地PC上的文件不对应)。
所以,我的解决方案只是发送带有请求的图像的网址,通常会这样:
return render_to_response('edit.html', {'image1': image1_url, ...})
然后,如果存在此信息,我使用jQuery将图像放在模板中的文件输入字段旁边,并在用户选择新文件时更新它。这不是最好的,但它确实有效。
我仍然很高兴听到任何其他解决方案。
答案 1 :(得分:0)
我会在Image中使用外键关系,而使用inlineformset_factory来生成表单。
ListingEditForm = inlineformset_factory(Listing, Image, max_num=3, extra=0)
我还会在Image模型中添加图像名称字段。这样,用户将在表单显示中显示上传的文件,并且如果他这样做,他也将能够删除图像。如果您需要无限制的上传,您只需将max_num更改为0并将其更改为1。
当然,这样您就无法将一个图像与一个列表对象关联起来,但是如果您需要用户能够删除不推荐的图像。