ValueError at /post/politics Поле 'id' ожидало число, но получило 'politics'
У меня есть шаблон posts.html
{% extends 'base2.html' %}
{% block posts %}
<div class="row">
<div class="leftcolumn">
<div class="cardpost">
<h1>{{posts.title}}</h1>
<h5>{{posts.created_at}}</h5>
<div class="fs-4">{{posts.body | safe}}</div>
</div>
</div>
</div>
{% endblock %}
posts.html расширяет base2.html, потому что я хочу, чтобы posts.html имел функциональность навигационной панели
<nav id="navbar" class="navbar">
<ul>
<li><a href="about">About</a></li>
<li><a href="guestposting">Guest Posting</a></li>
<li class="dropdown"><a href=""><span>Categories</span> <i class="bi bi-chevron-down dropdown-indicator"></i></a>
<ul>
<li><a href="tech">Tech</a></li>
<li><a href="bizconomics">Bizconomics</a></li>
<li><a href="politics">Politics</a></li>
<li><a href="religion">Religion</a></li>
<li><a href="sports">Sports</a></li>
</ul>
</li>
<li><a href="contactform">Contact</a></li>
</ul>
выше приведена секция навигационной панели, которая находится на base2.html, а также на index.html. Он отлично работает в index.html. Но когда пользователь находится на posts.html-> path('post/str:pk', views.post, name='post') и нажимает, например, на категорию politics, я получаю такую ошибку:
ValueError at /post/politics Поле 'id' ожидало число, но получило 'politics'.
Вот мои маршруты url
path('', views.index, name='index'),
path('post/<str:pk>', views.post, name='post'),
path('politicalpost/<str:pk>', views.politicalpost, name='politicalpost'),
path('bizconomicspost/<str:pk>', views.bizconomicspost, name='bizconomicspost'),
path('techpost/<str:pk>', views.techpost, name='techpost'),
path('sportspost/<str:pk>', views.sportspost, name='sportspost'),
path('religionpost/<str:pk>', views.religionpost, name='religionpost'),
path('subscribe', views.subscribe, name ='subscribe'),
path('contactform', views.contactform, name='contactform'),
path('about', views.about, name='about'),
path('guestposting', views.guestposting, name='guestposting'),
path('bizconomics', views.bizconomics, name='bizconomics'),
#These are the caregory urls
path('tech', views.tech, name='tech'),
path('sports', views.sports, name='sports'),
path('politics', views.politics, name='politics'),
path('religion', views.religion, name='religion'),
path('culture', views.culture, name='culture'),
path('culturepost/<str:pk>', views.culturepost, name='culturepost'),
Как сделать так, чтобы при нажатии на категорию politics пользователь перенаправлялся с posts.html на страницу politics->path('politics', views.politics, name='politics'),
Мой views.py
def index(request):
politics = Politics.objects.all().order_by('-created_at')
posts = Post.objects.all().order_by('-created_at')
trendingposts = Trending.objects.all().order_by('-created_at')
religions = Religion.objects.all().order_by('-created_at')
sliders = Heroslider.objects.all()
return render(request,
'index.html',
{'politics':politics, 'posts':posts,'trendingposts':trendingposts,'religions':religions, 'sliders':sliders})
def politics(request):
politics = Politics.objects.all()
return render(request, 'Politics/politics.html', {'politics':politics})
def post(request, pk):
posts = Post.objects.get(id=pk)
return render(request, 'posts.html', {'posts':posts})
Попробуйте изменить
<li><a href="politics">Politics</a></li>
с
<li><a href="{% url 'politics' %}">Politics</a></li>
Ваше представление post
требует pk
для запроса. Согласно вашему url
path('post/<str:pk>', views.post, name='post'),
url должен быть s.th., как /post/1
. Также обратите внимание, что pk в определении url должно быть целым числом:
path('post/<int:pk>', views.post, name='post'),
Если вы просто хотите перенаправить пользователя при нажатии на категорию на эту страницу, вам нужно просто создать html якорь <a>
, который указывает на нужный url, как например:
<li><a href="/politics/">Politics</a></li>