我没有一个例子,因为我现在没有处理任何相关的事情,但在阅读有关formset的文档后仍然很好奇:
最佳做法是将单个视图与多个不同的模型表单同时发布(而不是一个组合表单,因为您不能同时发布多个表单,但由于缺乏更好的解释...),有些是单一的模型形式,有些是1或更多的形式集(例如Person
,他的1 Address
和他的1或更多{{ 1}}}}},就像Django和Pet
一样。内联已经在Django中使用了一段时间,所以我怀疑是通过简单地复制/粘贴TabularInline
中的内容,有没有更好的实践,没有?
提前致谢
答案 0 :(得分:2)
你应该:
确保您正在使用事务(因此,请确保它们已打开,并且您使用的是MySQLAM表以外的其他内容)。这一直是真的,但是现在更是如此。 :)
使用多个forms.Form
/ forms.ModelForm
个对象,这些对象在一个HTML <form>
元素中组合在一起,例如......
的Python:
from django import forms
class FormA(forms.ModelForm):
[...]
class FormB(forms.ModelForm):
[...]
HTML:
<form method="post" action="/path/to/view/">
{% csrf_token %}
{{ form_a }}
{{ form_b }}
<input type="submit" value="Submit Form" />
</form>
然后,当您处理表单时,只需处理它们并确保在成功案例中要求两者都有效以实际完成视图。
from django.db import transaction
from django.http import HttpResponseRedirect
from django.template.response import TemplateResponse
from myapp.forms import FormA, FormB
@transaction.commit_on_success
def present_forms_to_user(request):
if request.method == 'POST':
form_a = FormA(request.POST)
form_b = FormB(request.POST)
if form_a.is_valid() and form_b.is_valid():
# processing code
return HttpResponseRedirect('/path/to/thank/you/page/')
else:
form_a = FormA()
form_b = FormB()
return TemplateResponse(request, 'templates/eggs.html', {
'form_a': form_a,
'form_b': form_b,
})
作为免责声明,请记住这是一个基本的示例存根,并不是盲目复制的。你的最终用例可能略有不同,那很好。