Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中将Pk或Slug传递给Generic DetailView?_Python_Django_Django Class Based Views - Fatal编程技术网

Python 在Django中将Pk或Slug传递给Generic DetailView?

Python 在Django中将Pk或Slug传递给Generic DetailView?,python,django,django-class-based-views,Python,Django,Django Class Based Views,我不熟悉Django基于类的视图。我试图通过一个简单的视图来获取帖子的详细信息。 My views.py: from django.views.generic import ListView, View, DetailView class GenreDetail(DetailView): model = Post template_name = "post.html" My URL.py: urlpatterns = [ url

我不熟悉Django基于类的视图。我试图通过一个简单的视图来获取帖子的详细信息。 My views.py:

from django.views.generic import ListView, View, DetailView 
class GenreDetail(DetailView):
            model = Post
            template_name = "post.html"
My URL.py:

urlpatterns = [
        url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
        url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
    ] 

因此,pk或slug不会传递到通用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()),
    ] 

正如@ozgur提到的,您还需要通过设置来告诉视图使用
post\u id
而不是
pk
,问题是您必须告诉
DetailView
它应该在URL中使用
post\u id
关键字,而不是默认的
pk
slug
,以获取将要访问的对象显示

这可以通过设置属性来完成:

(您的url定义也是错误的,请始终以
$
结尾您的url定义。下面是更正的版本)

或者,您可以将url中的
post_id
更改为
pk
,这样您就不必触摸视图中的任何内容:

url(r'(?P<pk>\d+)$', GenreDetail.as_view(), name = 'post'),
url(r'(?P<pk>\d+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
url(r'(?P\d+)$,genredeail.as_view(),name='post'),
url(r'(?P\d+)/(?P[-\w]+)$”,genredeail.as_view(),

如果您想使用post\u id或slug获取详细信息,那么您的URL应该如下所示

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
有关更多详细信息,请使用以下内容阅读。


请注意,Django 1.8pk\u url\u kwarg=“post\u id”slug\u url\u kwarg='slug'query\u pk\u和\u slug=true中引入了
query\u pk\u和\u slug
,在url中将查询参数的名称更改为
pk
,同样有效。谢谢。那么生成的URL是什么?
from django.views.generic import DetailView 

class GenreDetail(DetailView):
    model = Post
    template_name = "post.html"
    pk_url_kwarg = "post_id"
url(r'(?P<pk>\d+)$', GenreDetail.as_view(), name = 'post'),
url(r'(?P<pk>\d+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
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
from django.urls import path
from . import views

urlpatterns = [
    path('<pk>/', views.GenreDetail.as_view(), name="post")]
path('<slug:slug>/', views.GenreDetail.as_view(), name="post")