Cod*_*mon 12 python django django-class-based-views
我是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它可以接收,但事实并非如此.
Ane*_*pic 11
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所提到的,你还需要告诉视图使用post_id而不是pk通过设置pk_url_kwarg
如果你想使用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
有关详细信息,请阅读文档.