0

is_valid()フォームセットは検証に合格しますが、テンプレートで{{ formset.errors }}返されます。[{}, {}, {}, {}](modelformset_factory フォームセットのフォームごとに 1 つの {}。

とにかくフォームが正常に保存されることを理解していません...

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']
4

1 に答える 1

3

formset.errorsエントリがそのフォームに対応するリストです。フォームセットが有効な場合、個々のフォームにエラーがないためformset.errors、空の辞書のリストになります。

これは、空でないリストは常に と評価されるため、フォームセットが有効な場合でもformset.errorsが と評価されることを意味します。もう 1 つの落とし穴は、エラーの数ではなく、フォームセット内のフォームの数を返すことです。Django 1.6 には、この問題を解決する新しい方法があります。TrueTruelen(formset.errors)formset.total_error_count()

formset.non_form_errors()特定のフォームに関係のないエラーを返すメソッドもあることに注意してください。

詳細については、フォームセットの検証に関するドキュメントを参照してください。

于 2013-08-19T17:40:31.647 に答える