处理表单集中的错误表单
handling bad forms in a formset
我有一个跟踪产品数据的产品模型。对于每个产品条目,项目编号必须是唯一的:
#models.py
class Product(models.Model):
ad_date = models.CharField(max_length=20, unique=False, blank=True, null=True)
item_no = models.CharField(max_length=30, unique=True, blank=True, null=True)
mfg = models.CharField(max_length=30, unique=False, blank=True, null=True)
desc = models.CharField(max_length=200, blank=True, null=True)
…
记录通过模型表单集工厂提交,允许在提交时提交多个记录:
#views.py
def add_first(request):
FRFormset = modelformset_factory(Product, fields='__all__', extra=30, form=FRForm)
saved_records = 0
if request.method == 'POST':
formset = FRFormset(request.POST, request.FILES)
if(formset.is_valid()):
for form in formset:
if form.has_changed():
saved_records += 1
formset.save()
messages.success(request, '(' + str(saved_records) +') records successfully added to database.')
return HttpResponseRedirect('/b5/add_first/')
else:
queryset = Product.objects.none()
formset = FRFormset(queryset=queryset)
variables = RequestContext(request, {'formset':formset })
return render_to_response("b5/addfirst_form.html", variables)
我的问题是,如果其中一条记录的项目编号已经存在,则整个提交都会失败(抛出 ValueError -“视图……没有 return HttpResponse 对象。它return改为 None。")
在视图函数中是否可能有一个 try/except 子句我可以在表单循环内编写,这将允许重复记录静默失败,同时允许保存其他记录?或者还有其他方法可以配置该行为吗?
这根本不是特定于 formset 的,也不需要捕获任何异常。相反,您应该返回响应,这将显示哪些表单无效。
在您看来没有发生的原因很简单,就是最后两行在 else 语句中缩进了。将它们后移一个缩进,以便它们在表单集无效以及请求为 GET 时捕捉到这种情况。
我有一个跟踪产品数据的产品模型。对于每个产品条目,项目编号必须是唯一的:
#models.py
class Product(models.Model):
ad_date = models.CharField(max_length=20, unique=False, blank=True, null=True)
item_no = models.CharField(max_length=30, unique=True, blank=True, null=True)
mfg = models.CharField(max_length=30, unique=False, blank=True, null=True)
desc = models.CharField(max_length=200, blank=True, null=True)
…
记录通过模型表单集工厂提交,允许在提交时提交多个记录:
#views.py
def add_first(request):
FRFormset = modelformset_factory(Product, fields='__all__', extra=30, form=FRForm)
saved_records = 0
if request.method == 'POST':
formset = FRFormset(request.POST, request.FILES)
if(formset.is_valid()):
for form in formset:
if form.has_changed():
saved_records += 1
formset.save()
messages.success(request, '(' + str(saved_records) +') records successfully added to database.')
return HttpResponseRedirect('/b5/add_first/')
else:
queryset = Product.objects.none()
formset = FRFormset(queryset=queryset)
variables = RequestContext(request, {'formset':formset })
return render_to_response("b5/addfirst_form.html", variables)
我的问题是,如果其中一条记录的项目编号已经存在,则整个提交都会失败(抛出 ValueError -“视图……没有 return HttpResponse 对象。它return改为 None。")
在视图函数中是否可能有一个 try/except 子句我可以在表单循环内编写,这将允许重复记录静默失败,同时允许保存其他记录?或者还有其他方法可以配置该行为吗?
这根本不是特定于 formset 的,也不需要捕获任何异常。相反,您应该返回响应,这将显示哪些表单无效。
在您看来没有发生的原因很简单,就是最后两行在 else 语句中缩进了。将它们后移一个缩进,以便它们在表单集无效以及请求为 GET 时捕捉到这种情况。