Django: NoReverseMatch не является допустимой функцией - PullRequest
2 голосов
/ 28 июня 2019

При запуске моего локального сервера Django dev (2.2) в виртуальной среде я обнаружил след.Основные ключевые слова, которые являются частью этой ошибки, включают в себя «django.urls.exceptions.NoReverseMatch» и «недопустимая функция представления или имя шаблона».

Я делаю код, вроде своего курса Удеми, созданного НикомВальтер.Часть материала курса включает в себя написание рудиментарного блога с использованием Django.Я близок к концу модуля блога Ника.

Я полагаю, что где-то неверно ссылался на функцию или, возможно, неправильно настроил свой urlpattern.Есть несколько других членов SO, которые сталкивались с подобными ошибками при разрешении, обычно связанном с исправлением опечатки.Я попытался удалить множественное число моей функции post_details views.Я пробовал варианты в моем urls.py с различными комбинациями регулярных выражений (и без).Я чувствую, что я упускаю из виду что-то тривиальное.

Дошло до того, что я сравниваю свой код с исходным кодом конца курса преподавателя курса, и я не могу на всю жизнь понять,что я делаю не так.

Вот мой код:

urls.py :

from django.urls import path, re_path
# from . import views
from posts.views import *
from redactors.views import *
from counters.views import *
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
  path('admin/', admin.site.urls),
  path('', home, name='home'),
  path('result/', result, name='result'),
  path('seth/', counters, name='seth'),
  path('james/', posts, name='james'),
  re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='james'),
  path('simon/', redactors, name='simon'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

posts / views.py:

from django.shortcuts import redirect, render, get_object_or_404
from .models import Post

def posts(request):
    posts = Post.objects.order_by('-pub_date')
    return render(request, 'posts/james.html', {'posts':posts})

def post_details(request, post_id):
    post = get_object_or_404(Post,pk=post_id)
    return render(request, 'posts/detailed.html', {'post':post})

posts / templates / posts / details.html :

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Neptune Blog</title>

  </head>
  <body>

  <h1>{{ post.title }}</h1>

      <a href="{% url 'post_details' post.id %}"><h1>{{ post.title }}</h1></a>
      <h4><span class="glyphicon glyphicon-time" aria-hidden="true"></span> {{ post.pub_date_pretty }}</h4>
      <br />
      <img src="{{ post.image.url }}" class="img-responsive center-block" style="max-height:300px;" />
      <br />
      <p>{{ post.body }}</p>
      <br />
      <br />
</body>
</html>

Я ожидаю, что мой блог будет загружен и правильно отображен.

Вот скриншот отладчика Django, показывающий трассировку в моем веб-браузере.

Вот трассировка от оболочки в полном объеме:

Файл "/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/urls/resolvers.py", строка 660, в _reverse_with_prefix

повышение NoReverseMatch (msg)

django.urls.exceptions.NoReverseMatch: обратное для 'post_details' не найдено.'post_details' не является допустимой функцией представления или именем шаблона.

1 Ответ

1 голос
/ 28 июня 2019

Если мы посмотрим на urls.py, мы увидим:

# urls.py

urlpatterns = [
    # ...
    re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, <b>name='james'</b>),
    # ...
]

, поэтому имя представления равно james, а не post_details. Таким образом, есть два варианта:

  1. используйте james при обращении к представлению; или
  2. изменить имя представления на post_details

Используйте james в качестве имени представления

Таким образом, вы должны написать URL как:

<a href="{% url <b>'james'</b> post_id=post.id %}"><h1>{{ post.title }}</h1></a>

Изменить название представления

Или вы можете изменить название представления курса (измените name='james' на name='post_details', так как это, вероятно, лучшее имя). В этом случае вам нужно будет изменить все, что уже относится к james, на новый вид:

# urls.py

urlpatterns = [
    # ...
    re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, <b>name='post_details'</b>),
    # ...
]

Здесь даже больше важно изменить имя представления, поскольку сейчас есть два представления, которые имеют имя 'james', что может привести к большому количеству путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...