Я получаю ошибку NoReverseMatch в sub_detail в Django

#django #django-models #django-views

#django #django-модели #django-просмотры

Вопрос:

Однако я знаю, что мое мнение верно, когда я вставляю {% url 'sub_detail' subc.id %} в index.html это внезапно выдает ошибку отсутствия обратного совпадения. Как только я удаляю его, индекс работает нормально. Я попытался изменить идентификатор, но это ничего не изменило, поскольку оно по-прежнему выдает ту же ошибку. Заранее спасибо.

views.py:

 from django.shortcuts import render, redirect, reverse, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import Slides, MainContent, SubContent
from .forms import TitleForm, SubContentForm, SlidesForm


def index(request):
   slides = Slides.objects.all()
   maincontent = MainContent.objects.all()
   subcontent = SubContent.objects.all()

   context = {
       'slides': slides,
       'maincontent': maincontent,
       'subcontent': subcontent,
   }
   return render(request, 'home/index.html', context)
   

def sub_detail(request, subc_id):
   subcontent = get_object_or_404(SubContent, pk=subc_id)
   context = {
       'subcontent': subcontent,
   }

   return render(request, 'home/sub_detail.html', context)
  

urls.py:

     path('', views.index, name='home'),
    path('<int:subc_id>/', views.sub_detail, name='sub_detail'),
    path('manage/', views.manage, name='manage'),
    path('slides/', views.slides, name='slides'),
    path('title/', views.add_title, name='add_title'),
    path('sub/', views.add_sub_content, name='add_sub_content'),
]
  

models.py:

 class SubContent(models.Model):
    class Meta:
        verbose_name_plural = 'Sub Content'

    title = models.CharField(max_length=28, null=False, blank=False)
    image = models.ImageField()
    description = models.TextField()

    def __str__(self):
        return self.title
  

index.html:

             <a href="{% url 'sub_detail' subc.id %}">
                <div class="col-md-6 section-index-img">
                    <img src="{{ sub.image.url }}" class="rounded img-fluid" alt=""/>
                </div>
            </a>
  

код ошибки:

 Environment:


Request Method: GET
Request URL: http://localhost:8000/

Django Version: 3.1
Python Version: 3.8.3
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'home',
 'crispy_forms',
 'products']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template /workspace/hunt-interiors/templates/base.html, error at line 0
   Reverse for 'sub_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['(?P<subc_id>[0-9] )/$']
   1 : <!doctype html>
   2 : {% load static %}
   3 : 
   4 : 
   5 : <html lang="en">
   6 :   <head>
   7 : 
   8 :     {% block meta %}
   9 :         <meta http-equiv="X-UA-Compatible" content="ie=edge">
   10 :         <meta charset="utf-8">


Traceback (most recent call last):
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/workspace/hunt-interiors/home/views.py", line 18, in index
    return render(request, 'home/index.html', context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/template/defaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/urls/base.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "/workspace/.pip-modules/lib/python3.8/site-packages/django/urls/resolvers.py", line 685, in _reverse_with_prefix
    raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /
Exception Value: Reverse for 'sub_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['(?P<subc_id>[0-9] )/$']
  

Ответ №1:

я думаю, что вы допустили одну ошибку с опечаткой, поэтому идентификатор не может быть получен по шаблону URL

 from:

 <a href="{% url 'sub_detail' subc.id %}">
                                 ^
to:
 <a href="{% url 'sub_detail' sub.id %}">
  

Комментарии:

1. Я был полностью уверен, что идентификатор исходит из представлений, я изменил на sub.id и это работает, приветствия.

Ответ №2:

Вы должны использовать sub.id вместо subc.id

Также лучше использовать app_name в вашем urls.py файл, а затем использую ваш URL-адрес, ссылаясь на имя приложения.

Например, имя вашего приложения «sub», тогда вы можете ссылаться на свой вид как href="{% url 'sub:sub_detail' sub.id %}" . Это гарантировало бы отсутствие смешивания, если у вас есть два одинаковых URL-адреса с одинаковыми именами (очевидно, в разных приложениях).