Django modelformset_factory无效,返回request.POST数据到表单

时间:2012-03-24 09:53:43

标签: django django-forms

我想使用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的变体范围,但没有快乐。

感谢您的任何建议!

3 个答案:

答案 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>