我正在通过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,它帮助我了解了什么是错误的。这与模型中的关系和一个必填字段有关。
它返回200,因为你说要返回200。确实,你返回了。
return render(request, 'blog/post.html', context)
和一个 render
将渲染模板,并通过一个 HttpResponse
默认为 status = 200
.
因此,你应该返回一些不同的东西,例如一个 JsonResponse
与 status=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)