2011-01-12 6 views
5

私は、次のモデルがあります:イメージをDjangoの編集フォームにバインドする方法は?

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

、この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') 

ba内のListingに関連付けることができる画像の数を制限しないckendですが、現時点では3つの画像しか必要としません。画像のアップロードはうまくいきますが、フォームをListingインスタンスにバインドすると、編集フォームが表示されたときに画像が「なし」にならないようになりますか?明らかに

、これだけでモデルの一部image1image2image3だけフォームフィールドであるため、仕事ではなく、しません。

form = forms.ListingEditForm(instance=listing) 

最初のパラメータは明らかのように思えるように辞書を追加します事が行うには:

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

が、その...の値が何をすべきですか?そして、それをListingインスタンスから取得するにはどうすればよいですか?

答えて

2

私が探していた答えではありませんが、自分の質問に答えるつもりです。私は周りを見回しました。私が知る限り、HTMLにはFile入力フィールドの内容を変更する信頼できる方法はありません。だから私は間違っているかもしれませんが、リクエストでその情報を送っても、Djangoはそのフィールドに情報を表示する方法がありません(ローカルPC上のファイルに対応していないので)。

だから、私の解決策は、1通常どおり、リクエストに画像のURLを送信するだけである:

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に追加するだけです。

もちろん、1つの画像を複数のリストオブジェクトに関連付けることはできませんが、ユーザーが画像を削除できるようにする必要がある場合とにかくお勧めしません。

関連する問題