Stack Overflow em Português Asked by Vitor Rezende on January 30, 2021
Python 3.8.3
Django 3.1.3
Eu não estou entendendo o motivo desse erro estar acontecendo.
Reverse for ‘post_detail’ not found. ‘post_detail’ is not a valid view function or pattern name.
A linha que o erro acusa é:
<li><a href="{% url 'post_detail' post.id %}" class="button">Read More</a></li>
A função está criada no views.py:
blog/blog/views.py
from django.shortcuts import render
from website.models import Post
def post_detail(request, id):
post = Post.objects.get(id=id)
return render(request, 'post_detail.html', {'post': post})
O URLs importa o módulo do post_detail, e usa ele pra criar um link novo de acordo com o id a cada post.
website/urls.py
from django.urls import path, include
from .views import hello_blog, post_detail
urlpatterns = [
path('', hello_blog),
path('post/<int:id>/', post_detail, name='post_detail'),
]
blog/website/templates/post_detail.html
<h1>Meu Post</h1>
{{ post }}
O Código funciona perfeitamente bem, até eu inserir a linha de comando pra redirecionar o link:
blog/website/templates/index.html
<html>
<section id="two">
<h2>Recent Work</h2>
<div class="row">
{% for post in posts %}
<article class="col-6 col-12-xsmall work-item">
<a href="{% static 'images/fulls/01.jpg' %}" class="image fit thumb"><img src="{% static 'images/thumbs/01.jpg' %}" alt="" /></a>
<h3>{{ post.title }}</h3>
<p>{{ post.sub_title }}</p>
<span> {{ post.get_category_label }} </span>
<ul class="actions">
<li><a href="{% url 'post_detail' post.id %}" class="button">Read More</a></li>
</ul>
</article>
{% endfor %}
</div>
</html>
Assim que eu insiro o a linha:Read More
Caro Vitor,
Acredito que o caminho para resolver o problema seja acrescentar o nome da app no arquivo urls.py
, deixando ele conforme abaixo:
from django.urls import path, include
from .views import hello_blog, post_detail
app_name = 'minha_app'
urlpatterns = [
path('', hello_blog),
path('post/<int:id>/', post_detail, name='post_detail'),
]
Depois é só inserir o nome da app no template conforme abaixo.
<li><a href="{% url 'minha_app:post_detail' post.id %}" class="button">Read More</a></li>
Esta forma sugerida evita que o DJango se confunda com o nome usado post_detail
uma vez que é o mesmo nome do método dentro de views.py
.
Parece estranho, mas um template pode chamar um método diretamente, todavia o DJango previne a passagem de parâmetros neste caso. Veja aqui
Acredito que também seja necessário mudar o nome da variável no urls.py
e explicitá-la no template quando passar na url, conforme abaixo.
urls.py
path('post/<int:post_id>/', post_detail, name='post_detail'),
blog/website/templates/index.html
<li><a href="{% url 'minha_app:post_detail' post_id=post.id %}" class="button">Read More</a></li>
Espero que ajude
Answered by Paulo Marques on January 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP