我想使用django modelformset_factory返回已在表单中输入的数据
视图
from django.forms.models import modelformset_factory
ArticleFormSet = modelformset_factory(Article, extra=2)
formset = ArticleFormSet(queryset=Article.objects.none())
if request.POST:
formset = ArticleFormSet(request.POST)
if formset.is_valid():
instances = formset.save(commit=False)
formset = ArticleFormSet(queryset=instances)
else:
## ?? RETURN formset with request.POST data in form ??
pass
模板
<form method="POST" id="articleForm" action=".">{% csrf_token %}
{% for form in forms %}
{{form.as_p}}
{% endfor %}
</form>
使用Django 1.4我得到了:
Validation Error: No exception supplied
尝试了initial=request.POST
的变体范围,但没有快乐。
感谢您的任何建议!
答案 0 :(得分:0)
你不需要做任何事情。您的formset已填充POST数据。只需将其传递给模板即可。通常的方法是不要使用else子句,而是直接进入首先显示表单的同一个render调用。
答案 1 :(得分:0)
检查“管理表格”的详细信息是否未被自动传递,事实证明它们不是(按此处:https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform)。
将此“管理表单数据”与request.POST
相关联,似乎已解决了其他神秘的validation
错误。我想知道这是一个真正的1.4错误吗?
if request.POST:
forms_mgmt = {'form-TOTAL_FORMS': u'2', 'form-INITIAL_FORMS': u'0', 'form-MAX_NUM_FORMS': u''}
data_dict = dict(request.POST.items() + forms_mgmt.items())
formset = ArticleFormSet(data_dict)
if formset.is_valid():
instances = formset.save(commit=False)
formset = ArticleFormSet(queryset=instances)
感谢@Daniel Roseman帮助我走错了路。
答案 2 :(得分:0)
继@Williams回答后,通过https://docs.djangoproject.com/en/dev/topics/forms/formsets/#understanding-the-managementform阅读,您可以发现管理表单数据可以使用function preserve_qs() {
if (empty($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], "?") === false) {
return "";
}
return "?" . $_SERVER['QUERY_STRING'];
}
header("Status: 301 Moved Permanently");
header("Location: ./content/index.html" . preserve_qs());
呈现到模板中:
{{ my_formset.management_form }}
然后,一旦表单发布,您可以使用:
<form method="POST" id="articleForm" action=".">{% csrf_token %}
{% for form in forms %}
{{form.as_p}}
{% endfor %}
{{ my_formset.management_form }}
</form>