Django:如何在gereric DetailView中使用自定义slug(必须使用对象pk或slug调用通用详细信息视图DetailView)

时间:2014-07-26 03:58:26

标签: python django generics

  

我是python django的新手。在关注Django Tutorial > Part04 > Generic View时,我无法使用Detail View。实际上它是我在StackOverflow上的第一个问题,所以如果我错了什么,请告诉我。非常感谢。

我想要什么?

  • 我认为url(r'^(?P<question_id>\d+)/$', views.DetailView.as_view(), name="detail")优于url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name="detail")。因为它更具可读性和直观性。
  • 所以我不想改变polls/urls.py
  • 我如何使用详细信息视图,但<CUSTOM_SLUG>
  • 上保留views.py

源代码

django_project/polls/urls.py(目前无效)

urlpatterns = patterns('',
    url(r'^$', views.IndexView.as_view(), name="index"),
    url(r'^(?P<question_id>\d+)/$', views.DetailView.as_view(), name="detail"),
    url(r'^(?P<question_id>\d+)/results/$', views.results, name="results"),
    url(r'^(?P<question_id>\d+)/vote/$', views.vote, name="vote"),
    )

django_project/polls/urls.py(工作来源,但我不想要这个。)

urlpatterns = patterns('',
    url(r'^$', views.IndexView.as_view(), name="index"),
    url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name="detail"),
    url(r'^(?P<question_id>\d+)/results/$', views.results, name="results"),
    url(r'^(?P<question_id>\d+)/vote/$', views.vote, name="vote"),
    )

django_project/polls/views.py

class DetailView(generic.DetailView):
  model = Question
  template_name = "polls/detail.html"

错误消息

通用详细信息视图必须使用对象pk或slug调用DetailView。

1 个答案:

答案 0 :(得分:2)

https://docs.djangoproject.com/en/1.6/intro/tutorial04/

  

DetailView通用视图需要调用从URL捕获的主键值&#34; pk&#34;,因此我们已将poll_id更改为pk以获取通用视图。

所以这显然不起作用:

url(r'^(?P<question_id>\d+)/$', views.DetailView.as_view(), name="detail"),

虽然这样可行:

url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name="detail"),

继承DetailView以使用不同的正则表达式组名称:

https://github.com/django/django/blob/master/django/views/generic/detail.py

但如果你继承DetailView,你可以告诉它pk参数是什么:

class MyCustomDetailView(DetailView):
    pk_url_kwarg = 'object_id'

pk是django中的标准术语;虽然这可能会使您的代码更具可读性, 任何对django感到满意的人都认为pk更具可读性。如果要自定义所有小细节,使用generic视图有什么意义?