Я пишу заявление в django 2.2 с ajax. Речь идет о разделе комментариев и ответах на комментарии. У меня две проблемы:
Написание нового комментария работает. Ответ на комментарий не работает, появляется ошибка: The view spot.views.SpotDetailView didn't return an HttpResponse object. It returned None instead.
Проверка - если комментарий добавлен, он работает, но ошибка появляется на всех windows для ответа к комментариям. Проверка ответа на комментарий не работает, вместо ошибки появляется источник страницы
view.py
class SpotDetail(DetailView):
model = Spot
context_object_name = 'spot'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form'] = CommentModelForm()
return context
class SpotDetailView(View):
def get(self, request, *args, **kwargs):
view = SpotDetail.as_view()
return view(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
view = SpotComment.as_view()
return view(request, *args, **kwargs)
class SpotComment(SingleObjectMixin, FormView):
template_name = 'spot/spot_detail.html'
form_class = CommentModelForm
model = Spot
def get_success_url(self):
return reverse('spot_detail_url', kwargs={'slug': self.object.slug, 'id': self.object.pk})
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.form_class(request.POST)
form.instance.spot = self.object
form.instance.author = self.request.user
if form.is_valid():
reply = request.POST.get('comment_id')
comment_qs = None
if reply:
comment_qs = Comment.objects.get(id=reply)
form.instance.reply = comment_qs
form.save()
if request.is_ajax():
context = {
'form': form,
'errors': form.errors,
'object': self.object,
}
html = render_to_string('spot/comments.html', context, request=request)
return JsonResponse({'form': html})
else:
context = {
'form': form,
'errors': form.errors,
'object': self.object,
}
html = render_to_string('spot/comments.html', context, request=request)
return JsonResponse({'form': html})
jQuery код:
$(document).on('submit', '.comment-form', function(event){
event.preventDefault();
var serialized = $('.comment-form').serialize();
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: serialized,
dataType: 'json',
success: function(response){
$('.comment-section').html(response['form']);
$('textarea').val('');
$('.reply-btn').click(function(){
$('.replied-comment').fadeToggle();
$('textarea').val('');
});
},
error: function(rs, e){
console.log(rs.responseText);
}
});
});
$(document).on('submit', 'form[id^="reply-comment-"]', function(event){
event.preventDefault();
var pk = $(form[id^="reply-comment-"]).attr('value');
var serialized = $('#reply-form' + pk).serialize();
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: serialized,
dataType: 'json',
success: function(response){
$('.comment-section').html(response['form']);
$('textarea').val('');
$('#reply-comment-btn-' + pk).click(function(){
$('.replied-comment').fadeToggle();
$('textarea').val('');
});
},
error: function(rs, e){
console.log(rs);
}
});
});