Шаблон 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 работает тихо. Если что-то в {{ }}
не работает, вы получаете подстановку нулевой строки, а не ошибку времени выполнения.