2011-01-12 34 views
5

我有以下型號:如何將圖像綁定到Django中的編輯窗體?

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') 

的想法是不限制可以與ba中的Listing相關聯的圖像的數量ckend,但是目前我只需要3張圖片。上傳圖片效果很好,但是如何將表單綁定到Listing實例,以便在查看編輯表單時圖像不是「無」?

顯然,這不會單獨工作,因爲image1image2image3僅表單域,而不是模型的一部分:

form = forms.ListingEditForm(instance=listing) 

所以加入字典作爲第一個參數似乎是顯而易見的做的事:

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

,但我應該是...的價值是什麼?我該如何從Listing實例中檢索它?

回答

2

我會回答我自己的問題,即使它不是我正在尋找的答案。我環顧四周,據我所知,在HTML中沒有可靠的方法來更改文件輸入字段的內容。所以,我可能是錯的,但即使您將請求發送出去,Django也無法顯示該字段中的信息(因爲它不對應於本地PC上的文件)。

所以,我的解決辦法是簡單地發送該請求圖像的網址,因爲人們通常會:

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

然後,如果該信息存在,我使用jQuery來放置圖像旁邊模板中的文件輸入字段,並在用戶選擇新文件時進行更新。這不是最好的,但它的工作原理。

我仍然很高興聽到任何其他解決方案。

0

我會在Image中使用外鍵關係,而inlineformset_factory用於生成表單。

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

我還要在圖像模型添加圖片名稱字段。這樣用戶就會在表單顯示中顯示上傳的文件,如果他願意,他也可以刪除圖像。如果您需要無限上傳,您可以簡單地將max_num更改爲0並將其更改爲1.

當然,您無法將一個圖像與多個清單對象相關聯,但是如果您需要用戶能夠刪除不建議。

相關問題