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
使用带有 Android 的 Room 使用 UUID 作为主键
将 Pk 或 Slug 传递给 Django 中的通用 DetailView?