Ajax POST请求200,但表单无效

问题描述 投票:1回答:1

我正在通过Ajax添加评论和回复,POST.request是OK的,但是表单本身是无效的,因此没有数据保存在DB中。请看下面我的一些代码:Views

def view_post(request, slug):
  post = Post.objects.get(slug=slug)
  comments = post.comments.filter(approved_comment=True, reply=None).order_by('-date_posted')
  form = CommentForm()
  if request.method == "POST":
    form = CommentForm(request.POST)
    if form.is_valid():
      comment = form.save(commit=False)
      reply_id = request.POST.get('comment_id')
      data = None

      if reply_id:
        data = Comment.objects.get(id=reply_id)

      comment.author = request.user
      comment.post = post
      comment.reply = data
      comment.save()
    else:
      print('form not valid')

  else:
      form = CommentForm()

  context = {
    'post' : post,
    'comments' : comments,
    'form' : form
  }

  if request.is_ajax():
    html = render_to_string('blog/comments.html', context, request=request)
    return JsonResponse({ 'form' : html })

  return render(request, 'blog/post.html', context)

而这里是Ajax请求

$.ajax({
    method: 'POST',
    url: `/post/${slug}/`,
    data: $(this).serialize(),
    dataType: 'json',
    success: function(response) {
      $(event.target).parents('.reply-form').hide()
      $('main-comment-section').html(response['form']);
      $('textarea').val('');
    },
    error: function(rs, e) {
      console.log(rs.responseText);
    },
  })
  event.preventDefault();
})

请大家多多指教。谢谢! -更新

-更新

非常感谢你的帮助,通过打印form.errors,它帮助我了解了什么是错误的。这与模型中的关系和一个必填字段有关。

django ajax django-forms
1个回答
1
投票

它返回200,因为你说要返回200。确实,你返回了。

return render(request, 'blog/post.html', context)

和一个 render 将渲染模板,并通过一个 HttpResponse 默认为 status = 200.

因此,你应该返回一些不同的东西,例如一个 JsonResponsestatus=400:

from django.http import JsonResponse

def view_post(request, slug):
    post = Post.objects.get(slug=slug)
    comments = post.comments.filter(
        approved_comment=True, reply=None
    ).order_by('-date_posted')
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            form.instance.author = request.user
            form.instance.post = post
            form.instance.reply_id = request.POST.get('comment_id')
            form.save()
        else:
            return JsonResponse({'status': 'fail'}, status=400)
    else:
        form = CommentForm()
    context = {
        'post' : post,
        'comments' : comments,
        'form' : form
    }
    if request.is_ajax():
        html = render_to_string('blog/comments.html', context, request=request)
        return JsonResponse({ 'form' : html })
    return render(request, 'blog/post.html', context)
© www.soinside.com 2019 - 2024. All rights reserved.