1

空のフォームを表示し、さらに編集するために以前に入力したフォームを表示する単一のビュー機能を試しています。これは私が現在持っている見解です:

def manage_contacts(request):
    ContactsFormSet = modelformset_factory(Contact)
    if request.method == 'POST':
        formset = ContactsFormSet(request.POST, request.FILES)
        if formset.is_valid():
            formset.save()
            return HttpResponseRedirect('/people/')
    else:
        formset = ContactsFormSet(queryset=Contact.objects.none())
    return render_to_response("contact.html", {
        "formset": formset,
    })

def edit_form(request, item_id):
    ContactsFormSet = modelformset_factory(Contact)
    if request.method == 'POST':
        instance = get_object_or_None(ContactsFormSet, pk=item_id)
        formset = Contact(request.POST, instance=instance)
        return render_to_response("contact.html", {
            "formset": formset,
    })

現在、2つの機能があります。1つは新しいフォームを表示し、もう1つは既存のデータを編集するための機能です。2番目の関数はエラーを出します。modelformset_factory既存のデータベース列から表示データを取得できませんでした。ただし、最初の関数は機能します。私が直面している問題は、両方を単一のビュー関数として書き直す方法が見つからないことです。これは私がモデルに持っているものです:https ://stackoverflow.com/a/14724113/498309

#urls.py
url(r'^edit/(?P<item_id>\d+)/$', 'app.views.edit_form'),

アップデート1

def contact_view(request, item_id=None):
    context_data = {}
    if item_id:
        contact = get_object_or_404(Contact, pk=item_id)
    if request.method == 'POST':
        forms_are_valid = True
        new_form = ContactForm(request.POST, prefix='new')
        if new_form.is_valid():
            new_form.save()
        else:
            forms_are_valid = False
            context_data['new_form'] = new_form
        if item_id:
            existing_form = ContactForm(request.POST, instance=contact,
                prefix='existing')
            if existing_form.is_valid():
                existing_form.save()
            else:
                forms_are_valid = False
                context_data['existing_form'] = existing_form 
        if forms_are_valid: 
            return HttpResponseRedirect('thanks/')
    else: 
        new_form = ContactForm(prefix='new')
        context_data['new_form'] = new_form
        if item_id:
            existing_form = ContactForm(instance=contact, prefix='existing')
            context_data['existing_form'] = existing_form
    return render_to_response('contact.html', context_data)

このビューにはフォームは表示されません。ただし、エラーは表示されず、htmlテンプレートのみが表示されます。

4

1 に答える 1

1

私はあなたが提案していることをするためにmodelformsetを使用しません。同じビューで2つのフォームを使用し、それらを区別するためにプレフィックスを追加するだけです-

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response

def contact_view(request, contact_id=None):
    context_data = {}
    if contact_id:
        contact = get_object_or_404(pk=contact_id)
    if request.method = 'POST': 
        forms_are_valid = True
        new_form = ContactForm(request.POST, prefix='new')
        if new_form.is_valid():
            new_form.save()
        else:
            forms_are_valid = False
            context_data['new_form'] = new_form  errors
        if contact_id:
            existing_form = ContactForm(request.POST, instance=contact,
                                        prefix='existing')
            if existing_form.is_valid():
                existing_form.save()
            else:
                forms_are_valid = False
                context_data['existing_form'] = existing_form 
        if forms_are_valid: 
            return HttpResponseRedirect('thanks/')
    else: 
        new_form = ContactForm(prefix='new')
        context_data['new_form'] = new_form
        if contact_id:
            existing_form = ContactForm(instance=contact, prefix='existing')
            context_data['existing_form'] = existing_form
    return render_to_response('contact.html', context_data)

定義のcontact_id引数を使用すると、新しい連絡先と既存の連絡先の両方にビューを使用できます。同じビューを指す2つのURLを設定します。1つはcontact_idを含み、もう1つは含まない-

url(r'^contact/(?P<contact_id>\d+)/$', 'app.views.contact_view'),
url(r'^contact/$', 'app.views.contact_view'),

ビューは、item_idが渡されているかどうかを確認します。渡されている場合は、既存の連絡先を処理していることがわかります。

私は実際にこのコードを実行していないのではないかと思います(そして予想よりも少し長いです)ので、バグがあるかもしれませんが、私は以前にこのパターンを何度も使用しました-それは機能します。

アップデート

ビューは、2つのフォームをテンプレートnew_formとに渡しexisting_formます。テンプレートにこれらのフォームを出力する最も簡単な方法は次のとおりです-

<form action="/contact/" method="post">
    {{ existing_form.as_p }}
    {{ new_form.as_p }}
    <input type="submit" value="Submit" />
</form>

詳細については、フォームテンプレートのカスタマイズに関するドキュメントをご覧ください。

于 2013-02-08T10:28:39.723 に答える