我使用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)保存到数据库中?