1

モデルフォームをajaxで送信し、モデルフォームの検証メッセージを使用したい:

class ComplaintForm(forms.ModelForm):
  class Meta:
      model = Complaint
      fields = [
          'title','body'
      ]


  def clean_body(self):
      form_data = self.cleaned_data
      body = self.cleaned_data.get('body', False)
      if len(body) < 2:
          raise forms.ValidationError(u'Please Add Complaint')
      return body

  def clean(self):
      cd = self.cleaned_data
      return cd

私からしてみれば:

def forms(request):
  form = ComplaintForm()
  if request.method == "POST":
      if request.is_ajax():
          form = ComplaintForm(request.POST)
          if form.is_valid():
              c = form.save(commit=False)
              c.user_ip = get_client_ip(request)
              c.user = request.user
              c.news =  news
              c.save()
              data = serializers.serialize('json', [c,])
          else:
              data = json.dumps([v for k,v in form.errors.items()])
              return HttpResponseBadRequest(data, mimetype='application/json')
          return HttpResponse(data, mimetype='application/json')

  else:
      form = ComplaintForm()

  return render_to_response('main/form.html', {'form': form},
                          context_instance=RequestContext(request))

しかし、私の問題は、 HttpResponseBadRequest を介してデータを送信するにはどうすればよいですか? 私のjsは:

$('.complaintform').submit(function(e){
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "/form/",
        dataType: "json",
        data: $(this).serialize(),
        success: function(data) {
            $('p').html('ok');                
        },
        error: function(data) {
           //how could i insert model form errors here?

        }
    });

});
4

1 に答える 1

2

私の答えを編集しました。最初にあなたの質問を誤解しました。

これを試して:

$('.complaintform').submit(function(e){
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "/form/",
        dataType: "json",
        data: $(this).serialize(),
        success: function(data) {
            $('p').html('ok');                
        },
        statusCode: {
            400: function() {
                var items = [];
                $.each( data, function( val ) {
                items.push( val ); 
                });
                $('p').html(items.join(""));
            }
        }
    });

});


それがうまくいかない場合、汚い回避策は次

のようになります: 1) ビュー内:

else:
    data = json.dumps([v for k,v in form.errors.items()] + ['failed'])
    return HttpResponseBadRequest(data, mimetype='application/json')

2) JavaScript で:

success: function(data) {
    if jQuery.inArray("failed", data) {
        data.splice("failed", 1);
        var items = [];
        $.each( data, function( val ) {
            items.push( val ); 
        });
        $('p').html(items.join(""));
    } else {
        $('p').html('ok');
    }                
},

何らかの奇妙な理由で、jquery が HttpResponse が「成功」であると判断した場合、これは機能します。

于 2013-10-19T16:22:41.197 に答える