【问题标题】:Django: How to use custom slug in gereric DetailView (Generic detail view DetailView must be called with either an object pk or a slug)Django:如何在 gereric DetailView 中使用自定义 slug(必须使用对象 pk 或 slug 调用通用详细视图 DetailView)
【发布时间】:2014-07-26 03:58:25
【问题描述】:

我是 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。
  • 如何使用详细视图,但在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"

错误信息

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

【问题讨论】:

标签: python django generics


【解决方案1】:

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

DetailView 通用视图期望从 URL 捕获的主键值称为“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 视图有什么意义?

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多