空のフォームを表示し、さらに編集するために以前に入力したフォームを表示する単一のビュー機能を試しています。これは私が現在持っている見解です:
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テンプレートのみが表示されます。