TransWikia.com

Erro Django 3.1.3 Reverse for 'post_detail' not found. 'post_detail' is not a valid view function or pattern name

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

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP