Как получить связанные объекты для публикации? - PullRequest
0 голосов
/ 13 апреля 2019

Проблема проста.У меня есть функция lazy_load_posts (), которая через AJAX-запрос добавляет все мои модельные комментарии ко всем статьям одинаково, но мне нужно только добавить связанные комментарии к одной статье.Я пробовал метод фильтра и prefetch_related, но это не сработало.Я также получаю сообщение об ошибке в консоли POST http://localhost:8000/lazy_load_posts/ 500 (внутренняя ошибка сервера)

My view.py

Класс PhotoDetailView (DetailView):

queryset = Photo.objects.select_related('user').prefetch_related('comments', 'comments__user', 'likes')
context_object_name = 'photo'
template_name = 'photo_detail.html'

def get_success_url(self):
    return reverse('photo_detail', kwargs={'pk': self.object.pk})

def get_context_data(self, **kwargs):
    context = super(PhotoDetailView, self).get_context_data(**kwargs)
    comments = self.object.comments.all()[:5]
    context['comments'] = comments
    context['form'] = AddCommentForm(initial={'post': self.object.pk})
    context['is_liked_by_user'] = self.request.user in self.object.likes.all()

    return context

def lazy_load_posts (запрос):

    page = request.POST.get('page')
    comments = Comment.objects.all()
    results_per_page = 5
    paginator = Paginator(comments, results_per_page)
    try:
        comments = paginator.page(page)
    except PageNotAnInteger:
        comments = paginator.page(2)
    except EmptyPage:
        comments = paginator.page(paginator.num_pages)
    posts_html = loader.render_to_string(
        'comments.html',
        {'comments': comments}
    )
    output_data = {
        'posts_html': posts_html,
        'has_next': comments.has_next(),
    }
    return JsonResponse(output_data)


and my script.js

$('#lazyLoadLink').on('click', function() {
    var link = $(this);
    var page = link.data('page');
    $.ajax({
      type: 'post',
      url: '/lazy_load_posts/',
      data: {
        'page': page,
        'csrfmiddlewaretoken': window.CSRF_TOKEN
      },
      success: function(data) {
        console.log(data)
        if (data.has_next) {
            link.data('page', page+1);
        } else {
          link.hide();
        }

        $('#posts').append(data.posts_html);
      },
      error: function(xhr, status, error) {

      }
    });
  });
...