Почему я получаю эту ошибку noreversematch?

Я следую руководству Mozilla по простому веб-приложению Django здесь. Я действительно собираюсь использовать его в качестве шаблона для веб-сайта, который я делаю для своей работы, связанной с управлением оборудованием. Итак, при попытке добавить страницу со ссылкой /catalog/models (модель - это номер детали оборудования) я получаю следующую ошибку. Я чувствую, что это может быть небольшая ошибка, которую я просто не вижу. Извинения за ужасное форматирование.

/catalog/models.py:

from django.db import models
from django.urls import reverse 
the URL patterns
import uuid
import datetime

class Book(models.Model):
    """Model representing a book (but not a specific copy of a book)"""
    title = models.CharField(max_length = 200)
    author = models.ForeignKey('Author', on_delete = models.SET_NULL, null = True)

    # Foreign Key used because book can only have one author, but authors can have multiple books
    # Author as a string rather than object because it hasn't been declared yet in the file.
    summary = models.TextField(max_length = 1000, help_text = 'Enter brief descp. of book') #TextField for longer descp.
    isbn = models.CharField('ISBN', max_length = 13, help_text = '13 character <a href="https://www.isbn-international.org/content/what-isbn">ISBN number</a>')

    #ManyToManyField used because genre can contain many books. Books can cover many genres.
    #Genre class has already been defined so we can specify the object above.
    genre = models.ManyToManyField(Genre, help_text = 'Select genre for this book') #Genre capitalized, calling model up

    def __str__(self):
        """String for representing the Model object."""
        return self.title

    def get_absolute_url(self):
        """returns the URL to access a detail record for this book."""
        return reverse('book-detail', args=[str(self.id)])

    class Model(models.Model):
        model_number = models.CharField('Model Number', max_length = 50)
        manufacturer = models.ForeignKey('Manufacturer', on_delete = 
     models.SET_NULL, null = True)
        category = models.ForeignKey('Category', on_delete = 
    models.SET_NULL, null = True)
        description = models.TextField(max_length = 1000, help_text = 
    "Enter brief description of product", null = True) #TextField for 
    longer descriptions

    def __str__(self):
        return f'{self.model_number}..........{self.description}'

    def get_absolute_url(self):
        #Returns the url to access a particular location instance
        return reverse('model-detail', args=[str(self.id)])

`` /catalog/admin.py:

from django.contrib import admin
# Register your models here.
from .models import Book, Model

admin.site.register(Book)
admin.site.register(Model)

`` /catalog/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('books/', views.BookListView.as_view(), name='books'),
    path('book/<int:pk>', views.BookDetailView.as_view(), name='book- 
detail'),
    path('models/', views.ModelListView.as_view(), name='models'),
]

`` /catalog/views.py

from django.shortcuts import render #generates HTML fiels using a template and data
#from django.http import HttpResponse
from .models import Book, Author, BookInstance, Genre, Model, Item, 
Category, Ownership, Manufacturer, Location #imports model classes to 
access data in views
from django.views import generic

def index(request):
    """View function for home page of site."""

    #Generate counts of some of the main objects
    num_books = Book.objects.all().count()
    num_instances = BookInstance.objects.all().count()

    #Available books (status - 'a')
    num_instances_available = 
BookInstance.objects.filter(status__exact='a').count()

    #The 'all()' is implied by default.
    num_authors = Author.objects.count()

    context = {
        'num_books': num_books,
        'num_instances': num_instances,
        'num_instances_available': num_instances_available,
        'num_authors': num_authors,
    }

    #Render the HTML template index.html with the data in the context 
variable
    return render(request, 'index.html', context=context)

class BookListView(generic.ListView):
    model = Book

class BookDetailView(generic.DetailView):
    model = Book

class ModelListView(generic.ListView):
    model = Model

class ModelDetailView(generic.DetailView):
    model = Model

`` /catalog/templates/base_generic.html:

<!DOCTYPE html>
<html lang="en">
<head>
  {% block title %}<title>Local Library</title>{% endblock %}
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384- 

MCw98 / SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO "crossorigin =" anonymous ">

  <!-- Add additional CSS in static file -->
  {% load static %}
  <link rel="stylesheet" href="{% static 'css/styles.css' %}">
</head>
<body>
  <div class="container-fluid">
    <div class="row">
      <div class="col-sm-2">
      {% block sidebar %}
      <ul class="sidebar-nav">
        <li><a href="{% url 'index' %}">Home</a></li>
        <li><a href="{% url 'books' %}">All books</a></li>
        <li><a href="{% url 'models' %}">All Equipment</a></li>
        <li><a href="">All authors</a></li>
        <li><a href="">Scan Equipment Out</a></li>
        <li><a href="">Scan Equipment In</a></li>
        <li><a href="">Search For Equipment</a></li>
      </ul>
     {% endblock %}
      </div>
      <div class="col-sm-10 ">
      {% block content %}{% endblock %}
      </div>
    </div>
  </div>
</body>
</html>

`` /catalog/templates/catalog/model_list.html:

{% extends "base_generic.html" %}

{% block content %}
    <h1>Model list</h1>
    {% if model_list %}
    <ul>
      {% for model in model_list %}
        <li>
          <a href="{{ model.get_absolute_url }}">{{ model.model_number }}</a>
        </li>
      {% endfor %}
    </ul>
    {% else %}
        <p>There is no equipment in the database</p>
    {% endif %}
{% endblock %}

СООБЩЕНИЕ ОБ ОШИБКЕ: enter image description here

БОЛЬШЕ ОШИБКИ

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8080/catalog/models/

Django Version: 2.0.7
Python Version: 3.6.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'catalog.apps.CatalogConfig']
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 /Users/jeremy/weston_geophysical_corp/database/weston/locallibrary/locallibrary/catalog/templates/base_generic.html, error at line 21
   Reverse for 'models' not found. 'models' is not a valid view function or pattern name.
   11 :   <link rel="stylesheet" href="{% static 'css/styles.css' %}">
   12 : </head>
   13 : <body>
   14 :   <div class="container-fluid">
   15 :     <div class="row">
   16 :       <div class="col-sm-2">
   17 :       {% block sidebar %}
   18 :       <ul class="sidebar-nav">
   19 :         <li><a href="{% url 'index' %}">Home</a></li>
   20 :         <li><a href="{% url 'books' %}">All books</a></li>
   21 :         <li><a href=" {% url 'models' %} ">All Equipment</a></li>
   22 :         <li><a href="">All authors</a></li>
   23 :         <li><a href="">Scan Equipment Out</a></li>
   24 :         <li><a href="">Scan Equipment In</a></li>
   25 :         <li><a href="">Search For Equipment</a></li>
   26 :       </ul>
   27 :      {% endblock %}
   28 :       </div>
   29 :       <div class="col-sm-10 ">
   30 :       {% block content %}{% endblock %}
   31 :       </div>


Traceback:

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  158.                 response = self.process_exception_by_middleware(e, request)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  156.                 response = response.render()

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/response.py" in render
  106.             self.content = self.rendered_content

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/response.py" in rendered_content
  83.         content = template.render(context, self._request)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/backends/django.py" in render
  61.             return self.template.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render
  175.                     return self._render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in _render
  167.         return self.nodelist.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/loader_tags.py" in render
  67.                 result = block.nodelist.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render
  943.                 bit = node.render_annotated(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/base.py" in render_annotated
  910.             return self.render(context)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/template/defaulttags.py" in render
  447.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/urls/base.py" in reverse
  90.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "/Users/jeremy/anaconda/envs/py36/lib/python3.6/site-packages/django/urls/resolvers.py" in _reverse_with_prefix
  636.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /catalog/models/
Exception Value: Reverse for 'models' not found. 'models' is not a valid view function or pattern name.

Пожалуйста, опубликуйте полное сообщение об ошибке!

Ines Tlili 10.08.2018 17:07

@InesTlili Извините! Добавил, спасибо.

NaN 10.08.2018 17:15
2
2
928
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка генерируется последней строкой в ​​файле models.py:

return reverse('model-detail', args=[str(self.id)])

У вас нет URL-адреса, который соответствует этой обратной функции, как в случае с книгами. Добавьте к своим URL-адресам следующий путь:

path('model/<int:pk>', views.ModelDetailView.as_view(), name='model-detail'),

и все должно работать нормально.

Хм, но класс Book имеет ту же линию return, что и 'book-detail', и эта страница все еще работает на /catalog/books/. Может ли быть, что model - это зарезервированное слово в Django, и мне не следует его использовать?

NaN 10.08.2018 18:07

Нет, это не при чем. это был не ваш вопрос в первую очередь :) Вы спросили о NoReverseMatch, и это решает проблему. Задайте другой вопрос, если у вас есть другая проблема :)

Ines Tlili 10.08.2018 18:14

К сожалению, это не решило проблему, поэтому я задал дополнительный вопрос. Чтобы расширить: класс Book имеет path('books/', views.BookListView.as_view(), name='books'), и переходит на страницу книг, так почему бы модели не совпадать и переходить на страницу модели?

NaN 10.08.2018 18:39

Вот ошибка: Using the URLconf defined in locallibrary.urls, Django tried these URL patterns, in this order: admin/ catalog/ [name='index'] catalog/ books/ [name='books'] catalog/ book/<int:pk> [name='book-detail'] catalog/ model/<int:pk> [name='model-detail'] ^static\/(?P<path>.*)$ The current path, catalog/models/, didn't match any of these

NaN 10.08.2018 18:41

Вы удалили этот путь ??? : путь ('модели /', views.ModelListView.as_view (), name = 'models'),]. Потому что это единственное объяснение

Ines Tlili 10.08.2018 19:10

Да, я должен был?

NaN 10.08.2018 19:12

Нет-нет, я не имел в виду, чтобы вы его удалили. Добавь обратно!

Ines Tlili 10.08.2018 19:13

T'es le bienvenu: D

Ines Tlili 10.08.2018 19:22

Другие вопросы по теме