def validate(request, *args, **kwargs): form_class = kwargs.pop('form_class') extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {}) kwargs = extra_args_func(request, *args, **kwargs) kwargs['data'] = request.POST form = form_class(**kwargs) if form.is_valid(): data = { 'valid': True, } else: if request.POST.getlist('fields'): fields = request.POST.getlist('fields') + ['__all__'] errors = dict([(key, val) for key, val in form.errors.iteritems() if key in fields]) else: errors = form.errors final_errors = {} for key, val in errors.iteritems(): if key == '__all__': final_errors['__all__'] = val if not isinstance(form.fields[key], forms.FileField): html_id = form.fields[key].widget.attrs.get( 'id') or form[key].auto_id html_id = form.fields[key].widget.id_for_label(html_id) final_errors[html_id] = val data = { 'valid': False, 'errors': final_errors, } json_serializer = LazyEncoder() return HttpResponse(json_serializer.encode(data), mimetype='application/json')
def validate(request, *args, **kwargs): form_class = kwargs.pop('form_class') defaults = {'data': request.POST} extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {}) defaults.update(kwargs) kwargs = extra_args_func(request, *args, **kwargs) defaults.update(kwargs) form = form_class(**defaults) if form.is_valid(): data = { 'valid': True, } else: # if we're dealing with a FormSet then walk over .forms to populate errors and formfields if isinstance(form, BaseFormSet): errors = {} formfields = {} for f in form.forms: for field in f.fields.keys(): formfields[f.add_prefix(field)] = f[field] for field, error in f.errors.iteritems(): errors[f.add_prefix(field)] = error if form.non_form_errors(): errors['__all__'] = form.non_form_errors() else: errors = form.errors formfields = dict([(fieldname, form[fieldname]) for fieldname in form.fields.keys()]) # if fields have been specified then restrict the error list if request.POST.getlist('fields'): fields = request.POST.getlist('fields') + ['__all__'] errors = dict([(key, val) for key, val in errors.iteritems() if key in fields]) final_errors = {} for key, val in errors.iteritems(): if '__all__' in key: final_errors[key] = val elif not isinstance(formfields[key].field, forms.FileField): html_id = formfields[key].field.widget.attrs.get( 'id') or formfields[key].auto_id html_id = formfields[key].field.widget.id_for_label(html_id) final_errors[html_id] = val data = { 'valid': False or not final_errors, 'errors': final_errors, } json_serializer = LazyEncoder() return HttpResponse(json_serializer.encode(data), mimetype='application/json')