Добавление UUID в мое приложение Django приводит к ошибке NoReverseMatch - PullRequest
1 голос
/ 31 мая 2019

У меня есть приложение books, использующее UUID со списком всех книг и подробным видом отдельных книг.Я получаю следующее сообщение об ошибке:

NoReverseMatch at /books/
Reverse for 'book_detail' with arguments '('/books/71fcfae7-bf2d-41b0-abc8-c6773930a44c',)' not found. 1 pattern(s) tried: ['books/(?P<pk>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$']

Вот файл models.py:

# books/models.py
import uuid
from django.db import models
from django.urls import reverse


class Book(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=6, decimal_places=2)

    def __str__(self):
        return self.title

    def get_absolute_url(self): 
        return reverse('book_detail', args=[str(self.id)])

Файл urls.py, в котором я использую преобразовать id из модели в uuid.

 # books/urls.py
 from django.urls import path

from .views import BookListView, BookDetailView

urlpatterns = [
    path('', BookListView.as_view(), name='book_list'),
    path('<uuid:pk>', BookDetailView.as_view(), name='book_detail'),
]

Файл верхнего уровня urls.py выглядит следующим образом и добавляет маршрут books/.

# urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('books/', include('books.urls')),

Файл views.py:

from django.views.generic import ListView, DetailView
from .models import Book

class BookListView(ListView):
    model = Book
    context_object_name = 'book_list'
    template_name = 'books/book_list.html'

class BookDetailView(DetailView):
    model = Book
    context_object_name = 'book'
    template_name = 'books/book_detail.html'

и соответствующий файл шаблонов.

<!-- templates/book_detail.html -->
{% extends '_base.html' %}

{% block content %}
{% for book in book_list %}
<div>
  <h2><a href="{% url 'book_detail' book.get_absolute_url %}">{{ book.title }}</a></h2>
</div>
  {% endfor %}
{% endblock content %}

Я полагаю, что я реализую это правильно, но URL не нравится моему UUID.Что не так?

1 Ответ

3 голосов
/ 31 мая 2019

Проблема не в "добавлении uuid". Проблема заключается в том, что вы делаете обращение URL дважды: один раз в get_absolute_url и один раз в теге {% url %}. Используйте одно или другое, а не оба.

Либо:

<a href="{% url 'book_detail' book.pk %}">{{ book.title }}</a>

Или:

<a href="{{ book.get_absolute_url }}">{{ book.title }}</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...