【问题标题】:Writing a Django detail view with a generic class based view使用基于通用类的视图编写 Django 详细视图
【发布时间】:2013-04-28 21:55:11
【问题描述】:

我知道这很简单,但我错过了一些东西。因为我不记得了,我希望这可以在这里记录一个解决方案。

我要做的就是在 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 在 /1/ get() 返回了不止一页——它返回了 5!查找参数为 {}

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

感谢您的帮助。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    在 DetailView 中更简单:你可以指定模型:

    class AdventureDetail(DetailView):
    """ Get a time entry detail view """
    
        model = Page
        template_name = "adventure/AdventureDetail.html"
    

    仅此而已。 DetailView 将完成剩下的工作。

    另一种方式是指定查询集:

    class AdventureDetail(DetailView):
    """ Get a time entry detail view """
    
        queryset = Page.objects.all()
        template_name = "adventure/AdventureDetail.html"
    

    这将产生相同的结果。

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

    查看here了解详情

    【讨论】:

      【解决方案2】:

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

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

      另外,你为什么要覆盖get_objectDetailView 已经包含此功能,因此您需要做的就是拥有一个包含 pk 的 URL。

      【讨论】:

        【解决方案3】:

        在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")
        

        【讨论】:

          猜你喜欢
          • 2013-12-13
          • 2011-12-11
          • 2020-03-02
          • 1970-01-01
          • 2020-10-30
          • 1970-01-01
          • 2017-04-10
          • 1970-01-01
          • 2020-12-10
          相关资源
          最近更新 更多