Django:两个模型中的一个 url 搜索(cbv)

Posted

技术标签:

【中文标题】Django:两个模型中的一个 url 搜索(cbv)【英文标题】:Django: one url search in two models (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'

【问题讨论】:

【参考方案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 的解决方案,既简单又干净!

以上是关于Django:两个模型中的一个 url 搜索(cbv)的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的自定义 url 模式

Django Admin:使用url参数按日期搜索

将模型属性传递给 Django 中的 URL

如何在产品 URL 中使用多个 ASIN 搜索亚马逊

如何在sphinx-django中使用两个模型进行单索引搜索

Django - 详细视图 URL 中的模型 ID,第一个 ID 不起作用