Шаблон Dajngo не отображает содержимое

Когда я отображаю страницу blogpost.html, я не вижу никакого содержимого на моей странице. Пожалуйста, кто-нибудь из разработчиков помогите мне. Мой код выглядит следующим образом.

Мой urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='Blog_home'),
    path('<slug:slug>', views.blogpost, name='blogpost'),
]

my views.py

from django.shortcuts import render
from django.http import HttpResponse
from blog.models import Post

# Create your views here.

def index(request):
    post = Post.objects.all()
    context = {'post':post}
    return render(request, 'blog/bloghome.html', context)

def blogpost(request, post_id):
    post = Post.objects.filter(slug=slug)
    context = {'post':post}
    return render(request, 'blog/blogpost.html', context)

Название шаблона:- blogpost.html

{% extends 'basic.html' %}

{% block title %}Blog{% endblock title %}

{% block body %}

<div class="contaier">
    <div class="row">
        <div class="col-md-8 py-4">
            <h2 class=" blog-post-title">{{post.title}}</h2>
        </div>
    </div>
</div>

{% endblock body %}

Если я напишу так свой шаблон blogpost.html, то он будет работать.

{% extends 'basic.html' %}

{% block title %}Blog{% endblock title %}

{% block body %}

<div class="contaier">
    <div class="row">
        <div class="col-md-8 py-4">
            <h2 class=" blog-post-title">Django</h2>
        </div>
    </div>
</div>

{% endblock body %}

Вы передаете кверисет в качестве контекста. Ваш объект post содержит кверисет объектов Post, поэтому вы не можете получить post.title, вам нужно либо передать только один объект Post в ваш шаблон, либо перебрать все ваши объекты и затем отобразить post.title для каждого из них.

Скорее всего, вам нужен первый вариант, поэтому вам нужно изменить несколько вещей.

В своем urls.py вы определили свой blogpost вид через blogpost(request, post_id), тогда как в своем urls.py вы определили свой url как

path('<slug:slug>', views.blogpost, name='blogpost')

Если вы хотите получить id из вашего url, вы должны определить его как

path('<int:post_id>', views.blogpost, name='blogpost')

И в вашем blogpost представлении, вы делаете

post = Post.objects.filter(slug=slug)

но ваш slug не определен, потому что вы назвали его post_id.

Опять же, если вы хотите получить только post_id, вы должны использовать

post = Post.objects.get(pk=post_id)

Проблема в том, что вы не извлекаете сообщение с этим:

post = Post.objects.filter(slug=slug)

Это queryset, который возвращает ноль, один или, возможно, >1 объектов (последнее, если slugfield не указан уникальным)

Попытка:

post = Post.objects.get(slug=slug)

или лучше справляться с неудачами

post = get_object_or_404( Post, slug=slug)

Язык шаблонов Django работает тихо. Если что-то в {{ }} не работает, вы получаете подстановку нулевой строки, а не ошибку времени выполнения.

Вернуться на верх