Django:如何在通用 DetailView 中使用自定义 slug(DetailView 必须带对象 pk 或 slug)
我刚开始学习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
视图还有什么意义呢?