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_object
和 get_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_object
和 get_template_names
的解决方案,既简单又干净!以上是关于Django:两个模型中的一个 url 搜索(cbv)的主要内容,如果未能解决你的问题,请参考以下文章