Django如何使用带有UUID而不是PK的通用视图

Posted

技术标签:

【中文标题】Django如何使用带有UUID而不是PK的通用视图【英文标题】:Django how to use generic view with UUID instead of PK 【发布时间】:2018-12-30 09:14:15 【问题描述】:

我正在尝试访问类似于

的网址

127.0.0.1:8000/posti/qNwEXBxXQdGI4KlQfoHWOA

但是我无法解析该 smalluuid。

这是错误:

NoReverseMatch at /posti/ Reverse for 'detail' with arguments '(SmallUUID('qNwEXBxXQdGI4KlQfoHWOA'),)' 未找到。 1 个图案 试过:['posti/(?P[0-9a-fA-F-]+)/$']

Django 在尝试在另一个具有如下字符串的视图中解决它时遇到问题:

from . import views
from django.conf.urls import url


app_name = 'posti'

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<slug>[0-9a-fA-F-]+)/$', views.DetailView.as_view(), name='detail'),

我的 DetailView 是这个:

class DetailView(generic.DetailView):
    model = Post
    template_name = 'posti/detail.html'
    slug_field = 'uuid'



    def get_queryset(self):
        """
        Excludes any questions that aren't published yet.
        """
        return Post.objects.all()

我尝试重写 get_object 但它没有做任何事情。我不明白是正则表达式错误还是我的观点有问题。

编辑:

我的索引模板引发了上面的错误,它有以下代码:

% if posti_list != null %
    <ul>
    % for post in posti_list %
        <li><a href="% url 'posti:detail' post.uuid %"> post.title </a></li>
    % endfor %
    </ul>
% else %
    <p>No posts are available.</p>
% endif %

我在 DetailView 类中添加了slug_url_kwarg = 'uuid',现在它可以工作了,但是现在我有了一个

AttributeError at /posti/qNwEXBxXQdGI4KlQfoHWOA/ 通用详细视图 必须使用对象 pk 或 slug 调用 DetailView。

当我尝试访问特定帖子时。

【问题讨论】:

【参考方案1】:

我在 DetailView 类中添加了slug_url_kwarg = 'uuid',现在它可以工作了,但是现在我有了一个

AttributeError at /posti/qNwEXBxXQdGI4KlQfoHWOA/ 通用详细视图 DetailView 必须使用对象 pk 或 slug 调用。

slug_url_kwarg 必须与您的 url 正则表达式组名称匹配(在您的情况下为 slug,这是 slug_url_kwarg 的默认值),因此您不应该更改它

详情请看这里的 Django 源代码 - https://github.com/django/django/blob/master/django/views/generic/detail.py#L8

【讨论】:

对。我读了一个例子,上面写着“slug”,我认为应该这样称呼它。

以上是关于Django如何使用带有UUID而不是PK的通用视图的主要内容,如果未能解决你的问题,请参考以下文章

使用 import 而不是 require() 时带有 uuid 的 MongooseError

与 Django 通用视图中的 pk 不同的 url 路径

使用带有 Android 的 Room 使用 UUID 作为主键

将 Pk 或 Slug 传递给 Django 中的通用 DetailView?

django 视图没有返回 HttpResponse 对象。它返回 None 而不是

难以将 slug 添加到 Django 中的通用详细信息视图