Django:如何在通用 DetailView 中使用自定义 slug(DetailView 必须带对象 pk 或 slug)

2 投票
1 回答
1127 浏览
提问于 2025-04-18 14:50

我刚开始学习Python的Django框架。在跟着Django教程 > 第四部分 > 通用视图的时候,遇到了使用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文件。
  • 我该如何使用Detail View,同时在views.py中保留<CUSTOM_SLUG>呢?

源代码

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"

错误信息

通用详细视图DetailView必须使用对象的主键(pk)或slug来调用。

1 个回答

2

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

DetailView这个通用视图希望从网址中获取的主键值叫做“pk”,所以我们把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视图还有什么意义呢?

撰写回答