2016-01-23 61 views
0

我有一个跟踪产品数据的产品模型。对于每个产品项,项目数量必须是唯一的:处理表单中的不良表格

#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 - “视图...没有返回HttpResponse对象,它返回None”)

在视图函数中可能有一个尝试/擅长pt子句我可以在表单循环中写入,这将允许重复记录在默认情况下失败,同时允许其他人保存?或者有另外一种方法可以配置这种行为?

回答

0

这不是特定于formset的,并且没有必要捕捉任何异常。相反,您应该返回响应,该响应将显示哪些表单无效。

在您的视图中没有发生的原因很简单,最后两行在else语句中缩进。将它们移回一个缩进,以便当formset无效时以及请求为GET时它们捕获该案例。

+0

是的,我只知道我没有返回响应,因为我的视图功能配置不正确。感谢您的简洁解释。 – kjarsenal