使用基于通用类的视图编写Django详细信息视图

时间:2013-04-28 21:55:11

标签: django django-views

我知道这很简单,但我遗漏了一些东西。因为我永远记不住这一点,我希望这可以在这里记录一个解决方案。

我想要做的就是为URL中的对象传递PK并获取详细信息视图。

地址:

    url(regex=r'^(?P<pk>\d+)/$',
    view=AdventureDetail.as_view(),
    name='adventure_detail',
),

查看:

class AdventureDetail(DetailView):
""" Get a time entry detail view """

    template_name = "adventure/AdventureDetail.html"

    def get_object(self):
        return get_object_or_404(Page)

但是我收到了“多个对象返回错误”

  

MultipleObjectsReturned at / 1 /   get()返回多个页面 - 它返回5!查找参数为{}

这感觉真的很傻。它应该“正常工作”,但我遗漏了一些明显的东西。

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

在DetailView中,它更简单:您只需指定模型:

class AdventureDetail(DetailView):
""" Get a time entry detail view """

    model = Page
    template_name = "adventure/AdventureDetail.html"

就是这样。 DetailView将完成剩下的工作。

另一种方法是指定queryset:

class AdventureDetail(DetailView):
""" Get a time entry detail view """

    queryset = Page.objects.all()
    template_name = "adventure/AdventureDetail.html"

这将有相同的结果。

最后一种方法是覆盖get_object方法。

查看here了解详情

答案 1 :(得分:3)

除了get_object_or_404类之外,您没有将任何其他参数传递给Page。所以现在你基本上都在查询所有页面。所以你需要这样做:

return get_object_or_404(Page, pk=self.kwargs.get('pk', None))

另外,为什么要覆盖get_objectDetailView已包含此功能,因此您只需拥有一个包含pk的网址。

答案 2 :(得分:0)

在views.py

from django.views.generic import DetailView
# Import your model that you want to use in details view for example
from .models import Post

class PostDetailView(DetailView):
  model = Post

然后创建一个具有以下名称转换的模板

<appname>/<model_viewtype>.html

在urls.py中 首先导入您创建的类视图。在我们的情况下是

from .views import PostDetailView

然后

path("post/<int:pk>/", views.PostDetailView.as_view(), name="PostDetailView")