2012-04-09 7 views
1

Djangoで書式セットを管理する方法がわかりません。これは私のviews.pyです:Djangoの書式でデータを挿入または更新する

def newAd(request): 
    newAdFormSet = modelformset_factory(Ad) 
    if request.method == 'POST': 
     formset = newAdFormSet(request.POST, request.FILES) 
     if formset.is_valid(): 
      formset.save() 
      return render_to_response('conf.html', 
            {'state':'Your ad has been successfull created.'}, 
            context_instance = RequestContext(request),) 
    else: 
     formset = newAdFormSet() 
    return render_to_response('ad_form.html', 
          {'form':formset}, 
          context_instance=RequestContext(request),) 

それは動作しますが、それは常に、最後に、空白のフォームを既存の各タプルに対して1つの充填済みのフォームを返すプラス。 ここでは、新しい挿入を行うために空白のフォームを返さなければならない場所と、代わりに更新を実行するために(広告のIDを渡す)単一の事前入力済みのフォームを返す必要がある方法を知ることができません。

+0

チェックhttps://docs.djangoproject.com/en/1.4/topics/forms/modelforms/#model-formsets – okm

+0

申し訳ありませんが、それはあなたの実際の問題が何であるかは明らかではありません。すべきではないことが起こっていますか? –

+0

okm、私はここで質問を投稿する前にそのページを複数回チェックしましたが、回答は見つかりませんでした... – Mark

答えて

4

modelformset_factoryとフォームセットは、それが唯一の余分な空白のフォームがある保証し、多くのことを解決するため、たとえば

def newAd(request): 
    newAdFormSet = modelformset_factory(Ad, extra=1) 
    if request.method == 'POST': 
     formset = newAdFormSet(request.POST, request.FILES) 
     if formset.is_valid(): 
      formset.save() 
      return render_to_response('conf.html', 
            {'state':'Your ad has been successfull created.'}, 
            context_instance = RequestContext(request),) 
    else: 
     formset = newAdFormSet(queryset=Ad.objects.all()) 
    return render_to_response('ad_form.html', 
          {'form':formset}, 
          context_instance=RequestContext(request),) 

注modelformset_factoryラインでextra=1をあなたのコードを取るのに役立ちます。また、else文の中の2番目のnewAdFormSetにqueryset=Ad.objects.all()を追加すると、DBからAdオブジェクト用のフォームをあらかじめ埋め込み、バックエンドコードが提出されたオブジェクトを認識できるように、主に隠しフィールドにPKを正しく設定します。

更新

あなたは、User()インスタンスを指すように、例えばからrequest.userをAd().codUを設定したい場合は、単純に、私はまだ100ないよ

instances = formset.save(commit=False) 
for obj in instances: 
    obj.codU = request.user 
    obj.save() 
+0

"formset = AdFormSet(queryset = Ad.objects.all()。filter(codU = request.user、id = idArt)) "2番目のelseでは、URLにidArtを渡して正確なオブジェクトを呼び出して更新できます(イメージフィールドは正しく更新されませんが、後で修正されます)。私は今、 "空白のフォームのみ"の部分を見逃しています:私はURLにIDを渡さない場合、空のフォームを返す必要がありますか?しかし、代わりに空白のページしか返さない... – Mark

+0

@ l736k formsetは複数の広告インスタンスを編集するためのもので、ビューにはIDは必要ありません。あなたは 'どんなidを渡す 'の意味がわからない。 'queryset = Ad.objects.filter(codU = request.user、id = idArt)'の場合、ビューは空白のページを返し、ビューとテンプレートの他の部分をチェックします。 formset部分は1つの空白のフォームをレンダリングさせる必要があります – okm

+0

私の間違い:extraは0に設定されています。私は "idArtがNoneの場合、"を追加して解決しました:AdFormSet = modelformset_factory(Ad、extra = 1)else:AdFormSet = modelformset_factory(Ad、extra = 0) "今、あなたもイメージフィールドで私を助けることができますか?私は新しい質問を開くことを好むなら、それは働いている管理者から... – Mark

0

てそれを設定することができますあなたの質問が何であるかはっきりしていますが、フォームセットがまったく必要ないように思えます。一度に1つのレコードを追加または更新することだけに興味がある場合は、フォームセットではなく、簡単なModelFormが必要です。だから、:

class AdForm(forms.ModelForm): 
    class Meta: 
     model = Ad 


def add_update_ad(request, pk=None): 
    if pk is not None: 
     instance = Ad.objects.get(pk=pk) 
    else: 
     instance = Ad() 

    if request.POST: 
     form = AdForm(request.POST, instance=instance) 
     if form.is_valid(): 
      new_instance = form.save() 
      return HttpResponseRedirect('my_confirmation_view') 
    else: 
     form = AdForm(instance=instance) 
    return render(request, 'ad_form.html', {'form': form}) 
+0

それが返されます: 例外の種類:\tはTypeError 例外値:\t /usr/local/lib/python2.7/dist-packages/django/core/handlers/base: 'strの' オブジェクトが呼び出し可能 例外場所ではありません.py in get_response、line 111 – Mark

+0

それほど役に立ちません。上記のコードのどの行が例外を引き起こしていますか? –

+0

this: "form = AdForm(instance = instance)" – Mark

関連する問題