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

时间:2017-04-26 20:11:40

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

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

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

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

我无法弄清楚如何将slu pass传递给下一个View。

我的网址:

'Convert input to a date
Dim myDate As Date
myDate = DateValue("1 " & cboMonth & " " & cboYear)
'Perform the required SUMIFS
txt101 = Application.WorksheetFunction.SumIfs(Range("C:C"), _
                                              Range("A:A"), "101", _
                                              Range("B:B"), ">=" & myDate, _
                                              Range("B:B"), "<=" & DateAdd("m", 1, myDate))
'txt102 = 
'txt103 = 
'txt104 =
'txt105 =

我的CBV:

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

1 个答案:

答案 0 :(得分:0)

问题是你正在弹出slu ,,它会从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']