【问题标题】:Django: one url search in two models (cbv)Django:两个模型中的一个 url 搜索(cbv)
【发布时间】:2017-09-24 10:00:27
【问题描述】:

使用 Django,我正在寻找一种方法来使用一个 url 模式(带有 slug)来查询一个模型,如果没有找到查询第二个模型。我正在使用基于类的视图。

我正在关注这个answer,并且正在调用下一个视图。但后来我收到以下错误:

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

我不知道如何将 slug 传递给下一个视图。

我的网址:

url(r'^(?P<slug>[-\w]+)/$', SingleView.as_view(), name='singleview'),

我的 CBV:

class SingleView(DetailView):

    def dispatch(self, request, *args, **kwargs):
    post_or_page_slug = kwargs.pop('slug')

    if Page.objects.filter(slug=post_or_page_slug).count() != 0:
        return PageDetailView.as_view()(request, *args, **kwargs)
    elif Post.objects.filter(slug=post_or_page_slug).count() != 0:
        return PostDetailView.as_view()(request, *args, **kwargs)
    else:
        raise Http404


class PageDetailView(DetailView):

    model = Page
    template_name = 'page-detail.html'


class PostDetailView(DetailView):

    model = Post
    template_name = 'post-detail.html'

【问题讨论】:

    标签: django django-urls django-class-based-views


    【解决方案1】:

    问题是您正在弹出 slug,这会将其从 kwargs 中删除。这意味着 slug 没有传递给视图。

    你可以改成:

    post_or_page_slug = kwargs.pop['slug'] 
    

    我通常不鼓励在另一个视图中调用MyView.as_view(request, *args, **kwargs)。基于类的视图旨在通过子类化来扩展,而不是通过在其他视图中调用它们。

    对于示例中的两个视图,您可以通过覆盖 get_objectget_template_names 将它们组合成一个视图。

    from django.http import Http404
    
    class PageOrPostDetailView(DetailView):
    
        def get_object(self):
            for Model in [Page, Post]:
                try:
                    object = Model.objects.get(slug=self.kwargs['slug'])
                    return object
                except Model.DoesNotExist:
                    pass
             raise Http404
    
        def get_template_names(self):
            if isinstance(self.object, Page):
                return ['page-detail.html']
            else:
                return ['post-detail.html']
    

    【讨论】:

    • 我采用了您建议的覆盖 get_objectget_template_names 的解决方案,既简单又干净!
    猜你喜欢
    • 2013-10-07
    • 2013-05-30
    • 1970-01-01
    • 2012-09-20
    • 2018-03-23
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多