Представление blog.views.BlogViews не возвращало объект HttpResponse.Вместо этого он вернулся - PullRequest
0 голосов
/ 24 сентября 2019

У меня проблема с просмотром главной страницы моего блога.Я прочитал много проблем с той же ошибкой, но не смог найти решение, которое, по моему мнению, соответствовало моей проблеме.

Я пытаюсь эмулировать свой старый код с новым представлением, чтобы я мог настроитьэто будет продолжаться в будущем.

  path('', ListView.as_view(
                    queryset=Post.objects.filter(posted_date__lte=now).order_by("-posted_date")[:25],
                    template_name="blog/blog.html")),

Ранее я использовал только вышеупомянутый шаблон URL для отображения моих сообщений в блоге, но я перехожу к просмотру:

def BlogViews(TemplateView):
  def get(self, request):
    posts = Post.objects.all().order_by("-posted_date")[:25]
    args = {
      'posts' : posts,
    }
    return render(request, 'blog/blog.html', args)

и новый URL

path('', BlogViews, name='blog'),

Однако это представление не работает и возвращает ошибку в заголовке.Я импортирую TemplateView, Post и рендеринг правильно, я верю.

1 Ответ

1 голос
/ 24 сентября 2019

TemplateView является представлением на основе классов, поэтому вы создаете его подкласс с помощью class.

class BlogViews(TemplateView):
    def get(self, request):
        posts = Post.objects.all().order_by("-posted_date")[:25]
        args = {
            'posts' : posts,
        }
        return render(request, 'blog/blog.html', args)

Затем используйте .as_view() в шаблоне URL.

path('', BlogViews.as_view(), name='blog'),

Избегайте переопределения get или post для представлений на основе классов.В итоге вы теряете функциональность родительского класса или дублируете его.Вы можете взять ListView.as_view(...) в качестве отправной точки для представления, например:

class BlogView(ListView):
    template_name="blog/blog.html"

    def get_queryset(self):
        # Use get_queryset instead of queryset because you want timezone.now()
        # to be called when the view runs, not when the server starts 
        return Post.objects.filter(posted_date__lte=timezone.now()).order_by("-posted_date")[:25]

В вашем случае может быть проще использовать представление на основе функций:

def blog_view(request):
    posts = Post.objects.all().order_by("-posted_date")[:25]
    args = {
        'posts' : posts,
    }
    return render(request, 'blog/blog.html', args)

Затем включите его в URL с:

path('', blog_view, name='blog'),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...