关于django的formset问题

我使用CreateView来创建视图,用formset创建的表单显示在模板中,但我不晓得为什么只要将self.request.POST传递给formset实例,然后对实例进行迭代,验证等操作,就报错,甚至连assert FALSE,(这个formset实例) 都报这个错误。
下面是调试代码:
views.py

class GrowPlan(CreateView):
    template_name = 'point/GrowPlan.html'
    form_class = GrowPlanForm
    # model = Output
    success_url = reverse_lazy('point:tasklist')

    def get_context_data(self,**kwargs):
        context = super(GrowPlan, self).get_context_data(**kwargs)
        CropData = Crop.objects.filter(IsLeaf=1)
        Data = CropData.values()
        GrowPlanFormset = formset_factory(GrowPlanForm, extra=CropData.count())
        formlist = [formobj for formobj in GrowPlanFormset()]
        context['CropList'] = zip(Data, formlist)
        return context

    def form_invalid(self, form):
        assert False, form

    def form_valid(self, form):
        form.save(commit=False)
        count = Crop.objects.filter(IsLeaf=1).count()
        GrowPlanFormset = modelformset_factory(Output,form=GrowPlanForm,extra=count)
        UserID = self.request.session['UserID']
        TID = self.kwargs['pk']
        CropID = Timing.objects.filter(TID=TID).first().CropID_id
        formset = GrowPlanFormset(self.request.POST) #我验证了POST数据是确确实实存在的
        if formset.is_valid():   #报错显示这行出了问题,但我去掉下一行又出现同样的问题
            instances = formset.save(commit=False)


        return super(GrowPlan, self).form_valid(form)

forms.py

class GrowPlanForm(ModelForm): 
    LY_Area = forms.DecimalField(
        required=False, max_digits=8, decimal_places=2,
        error_messages={
            'max_digits': '最大输入位数为八位',
            'decimal_places': '请保留两位小数'
        }
    )
    LY_UnitOutput = forms.DecimalField(
        required=False, max_digits=8, decimal_places=2,
        error_messages={
            'max_digits': '最大输入位数为八位',
            'decimal_places': '请保留两位小数'
        }
    )
    Area = forms.DecimalField(
        required=False, max_digits=8, decimal_places=2,
        error_messages={
            'max_digits': '最大输入位数为八位',
            'decimal_places': '请保留两位小数'
        }
    )

    class Meta:
        model = Output
        fields = ['LY_Area', 'LY_UnitOutput', 'Area']

GrowPlan.html

{% extends './base.html' %}
{% block title %}种植计划监测信息记录表{% endblock %}
{% block body %}
<p>信息采集点编码:{{ request.session.UserID }}</p>
<p>填报人员姓名:{{ request.session.UserName }}</p>
<p>当前填报时间:{% now "Y年m月d日" %}</p>
{{ form.non_field_errors }}
<form role="form" novalidate action=""  method="post">
{% csrf_token %}
<table border="1">
    <tr>
        <th>序号</th>
        <th>作物种类</th>
        <th>上年种植面积(亩)</th>
        <th>上年平均单产(公斤/亩)</th>
        <th>本年计划面积(亩)</th>
    <tr>
        {% for Crop,Form in CropList %}
        <tr>
            <td>{{ Crop.CropID }}</td>
            <td>{{ Crop.CropName }}</td>
            <td>{{ Form.LY_Area }}</td>
            <td>{{ Form.LY_UnitOutput }}</td>
            <td>{{ Form.Area }}</td>
        </tr>
        {% endfor %}
</table>
<input type="submit" value="提交" />`
</form>
{% endblock %}

报错信息:

Environment:


Request Method: POST
Request URL: http://localhost:8000/point/GrowPlan/1/

Django Version: 1.11.2
Python Version: 3.6.2
Installed Applications:
['home',
 'point',
 'captcha',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.locale.LocaleMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/usr/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/usr/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/usr/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/lib/python3.6/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/usr/lib/python3.6/site-packages/django/views/generic/base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "/usr/lib/python3.6/site-packages/django/views/generic/edit.py" in post
  217.         return super(BaseCreateView, self).post(request, *args, **kwargs)

File "/usr/lib/python3.6/site-packages/django/views/generic/edit.py" in post
  183.             return self.form_valid(form)

File "/home/xanthu/PycharmProjects/reportingdev/reporting/point/views.py" in form_valid
  59.         instances = formset.save(commit=False)

File "/usr/lib/python3.6/site-packages/django/forms/models.py" in save
  649.         return self.save_existing_objects(commit) + self.save_new_objects(commit)

File "/usr/lib/python3.6/site-packages/django/forms/models.py" in save_existing_objects
  751.         if not self.initial_forms:

File "/usr/lib/python3.6/site-packages/django/forms/formsets.py" in initial_forms
  189.         return self.forms[:self.initial_form_count()]

File "/usr/lib/python3.6/site-packages/django/utils/functional.py" in __get__
  35.         res = instance.__dict__[self.name] = self.func(instance)

File "/usr/lib/python3.6/site-packages/django/forms/formsets.py" in forms
  144.                  for i in range(self.total_form_count())]

File "/usr/lib/python3.6/site-packages/django/forms/formsets.py" in total_form_count
  116.             return min(self.management_form.cleaned_data[TOTAL_FORM_COUNT], self.absolute_max)

File "/usr/lib/python3.6/site-packages/django/utils/functional.py" in __get__
  35.         res = instance.__dict__[self.name] = self.func(instance)

File "/usr/lib/python3.6/site-packages/django/forms/formsets.py" in management_form
  98.                     code='missing_management_form',

Exception Type: ValidationError at /point/GrowPlan/1/
Exception Value: ['管理表单的数据缺失或者已被篡改']

这个问题我调试了很久没弄明白,求大牛看到帮下忙,非常感谢!
还有一般在django的基于类的视图中一般是怎样使用formset,将formset里的外键(就是在模型表单里没有给出的fields)保存到数据库中?

阅读 3.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题