1

Djangoでフォームセットを管理する方法がわかりません。これは私のviews.pyです:

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を渡す)単一の事前入力されたフォームを返す必要がある場所を言う方法がわかりません。

4

2 に答える 2

4

modelformset_factoryとformsetは、多くのことを解決するのに役立ちます。たとえば、コードを考えてみましょう。

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

extra=1modelformset_factory行に注意してください。これにより、余分な空白のフォームが1つだけ存在するようになります。またqueryset=Ad.objects.all()、elseステートメント内の2番目のnewAdFormSetでは、DBからAdオブジェクトのフォームを事前に入力し、送信されたオブジェクトを認識するバックエンドコードのほとんど非表示のフィールドにPKを正しく設定します。

アップデート

Ad().codUインスタンス、たとえばrequest.userを指すように設定するUser()場合は、次のように設定するだけです。

instances = formset.save(commit=False)
for obj in instances:
    obj.codU = request.user
    obj.save()
于 2012-04-09T14:28:07.517 に答える
0

あなたの質問が何であるかはまだ100%明確ではありませんが、フォームセットはまったく必要ないようです。一度に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})
于 2012-04-09T15:11:49.010 に答える