将UUID添加到我的Django应用中会产生NoReverseMatch错误

时间:2019-05-31 16:08:00

标签: python django

我有一个使用UUID的books应用,该应用具有所有书籍的列表视图和各个书籍的详细视图。我不断收到以下错误消息:

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的{​​{1}}文件。

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'

我相信我已经正确实现了,但是URL不喜欢我的UUID。什么是不对?

1 个答案:

答案 0 :(得分:3)

问题不在于“添加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>