[英]Passing Pk or Slug to Generic DetailView in Django?
我是Django Class视图的新手。 我正在尝试制作一个简单的视图来获取帖子的详细信息。 我的views.py:
from django.views.generic import ListView, View, DetailView
class GenreDetail(DetailView):
model = Post
template_name = "post.html"
我的urls.py:
urlpatterns = [
url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
]
我得到的错误:
AttributeError at /2/memoirs-of-a-geisha-by-arthur-golden
Generic detail view GenreDetail must be called with either an object pk or a slug.
因此pk或slug不会传递给Generic Detailview。 我怎么通过? 我假设从url它可以接收,但事实并非如此。
url模式按照您定义它们的顺序进行检查
所以在这里:
urlpatterns = [
url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
]
...第一个模式匹配(因为它不以$
结尾,因此只会忽略额外的段)
...而且该模式只传递一个关键字arg
通常,将多个url模式指向同一视图是个坏主意。 如果可能的话,你应该尝试制作一个正则表达式(例如使用可选组 )来处理特定视图的URL的各种情况。 这样更明确。
另一方面,简单地颠倒模式的顺序以使更明确的模式首先也可以正常工作(这是urlpatterns的Django规则!)
urlpatterns = [
url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
]
正如@ozgur提到的那样,您还需要通过设置pk_url_kwarg
来告诉视图使用post_id
而不是pk
如果你想使用post_id或slug获取细节,那么你的网址应该是这样的
url(r'post/(?P<post_id>\d+)/$', GenreDetail.as_view(), name = 'post_detail'),
url(r'post/(?P<slug>[-\w]+)/$', GenreDetail.as_view(), name = 'post_detail_slug'),
你的观点应该是这样的
from django.views.generic import DetailView
class GenreDetail(DetailView):
model = Post
template_name = "post.html"
pk_url_kwarg = "post_id"
slug_url_kwarg = 'slug'
query_pk_and_slug = True
有关详细信息,请阅读文档 。
问题是你必须告诉DetailView
它应该在URL中使用post_id
关键字而不是默认的pk
或slug
才能获得将要显示的对象。
这可以通过设置pk_url_kwarg
属性来完成:
(你的网址定义也是错误的,总是用$
结束你的网址定义。以下是修正后的版本)
url(r'(?P<post_id>\d+)$', GenreDetail.as_view(), name = 'post'),
url(r'(?P<post_id>\d+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
鉴于上面的url模式,以下网址将匹配:
from django.views.generic import DetailView
class GenreDetail(DetailView):
model = Post
template_name = "post.html"
pk_url_kwarg = "post_id"
或者,您可以在网址中将post_id
更改为pk
,这样您就不必触摸视图中的任何内容:
url(r'(?P<pk>\d+)$', GenreDetail.as_view(), name = 'post'),
url(r'(?P<pk>\d+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
使用路径 :
from django.urls import path
from . import views
urlpatterns = [
path('<pk>/', views.GenreDetail.as_view(), name="post")]
slug
::
path('<slug:slug>/', views.GenreDetail.as_view(), name="post")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.