2013-08-19 69 views
0

该模板通过is_valid()验证,但{{ formset.errors }}返回[{}, {}, {}, {}]。 (一{}在modelformset_factory formset中每个表单Django - Modelform is_valid()= True,但form.errors返回[{},{},{},{}]

我不明白,形式反正成功得救

def setMapOptions(request, map_name): 
    map_selected = EzMap.objects.get(map_name=map_name, created_by=request.user) 
    layers_ordered = LayerMapOptions.objects.filter(ezmap=map_selected).order_by('position') 
    layerForm = modelformset_factory(LayerMapOptions, form=LayerMapOptionsForm, extra=0) 

    if request.POST: 
     pk_list = [int(x) for x in request.POST.get("layersOrder").split(',')] 
     formset = layerForm(request.POST, queryset=layers_ordered) 
     if formset.is_valid(): 
      for form in formset: 
       instance = form.instance 
       instance.position = pk_list.index(instance.pk) 
       instance.save() 

    else: 
     formset = ezMapOptionFormSet(user=request.user, instance=map_selected) 
     formset2 = layerForm(queryset=layers_ordered) 

    tmsURL = "http://" + request.get_host() + "/ezmapping/tms/" 
    return render_to_response("ezmapping/manage_map_Options.html", {'formset': formset, 'map': map_selected, 'layersOrder': layers_ordered, 'tmsURL' : tmsURL, }, context_instance=RequestContext(request)) 

形式:

class ModelLinkWidget(forms.Widget): 
    def __init__(self, obj, attrs=None): 
     self.object = obj 
     super(ModelLinkWidget, self).__init__(attrs) 

    def render(self, name, value, attrs=None): 
     if self.object.pk: 
      return mark_safe(
       u'<a href="/ezmapping/layer/edit/%s">%s</a>' %\ 
         (
         self.object.pk, self.object 
         ) 
      ) 
     else: 
      return mark_safe(u'') 

class LayerMapOptionsForm(ModelForm): 
    link = forms.CharField(label='link', required=False) 

    def __init__(self, *args, **kwargs): 
     super(LayerMapOptionsForm, self).__init__(*args, **kwargs) 
     self.fields['link'].widget = ModelLinkWidget(self.instance.layer) 

    class Meta: 
     model = LayerMapOptions 
     fields = ['link', 'visible'] 

回答

3

formset.errors是一个列表,其条目对应于其形式,当formset有效时,单个表单上没有错误,因此formset.errors是空字典列表。这意味着即使当formset有效时,formset.errors也会评估为True,因为非空列表总是计算为True。另一个问题是,len(formset.errors)返回formset中的表单数量,而不是错误数量。在Django 1.6中有一个新的formset.total_error_count()方法来解决这个问题。

请注意,还有一个formset.non_form_errors()方法,该方法返回与任何特定形式无关的错误。

有关更多信息,请参阅formset validation上的文档。

相关问题