gpt4 book ai didi

django - 从 Django 中的通用 View DetailView 重定向

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:26:56 25 4
gpt4 key购买 nike

我正在使用 Django 的基于类的 DetailView 通用 View 来查找要显示的对象。在某些情况下,我不想显示对象,而是希望退出并发出 HTTP 重定向。我看不出我是怎么做到的。它适用于当用户点击我的应用程序中的对象但未使用规范 URL 时。因此,例如,在 StackOverflow 上,URL 采用以下形式:

http://stackoverflow.com/<content_type>/<pk>/<seo_friendly_slug>

例如:

http://stackoverflow.com/questions/5661806/django-debug-toolbar-with-django-cms-and-django-1-3

您实际上可以在 seo_friendly_slug 部分键入任何内容,它会将您重定向到通过 PK 查找的对象的正确规范 URL。

我希望在我的 DetailView 中做同样的事情。检索对象,检查它是否是规范 URL,如果不是,则重定向到项目的 get_absolute_url URL。

我无法在 get_object 中返回 HttpResponseRedirect,因为它需要查找的对象。我似乎无法从 get_context_data 返回它,因为它只需要上下文数据。

也许我只需要写一个手动 View ,但我想知道是否有人知道这是否可能?

谢谢!

飞行棋。

最佳答案

这不适合 DetailView。为此,您需要重写 BaseDetailView 的 get 方法,如下所示:

class BaseDetailView(SingleObjectMixin, View):
def get(self, request, **kwargs):
self.object = self.get_object()
context = self.get_context_data(object=self.object)
return self.render_to_response(context)

因此,在您的类中,您需要提供一个新的 get 方法,该方法在获取对象和设置上下文之间进行 URL 检查。像这样的东西:

def get(self, request, **kwargs):
self.object = self.get_object()
if self.request.path != self.object.get_absolute_url():
return HttpResponseRedirect(self.object.get_absolute_url())
else:
context = self.get_context_data(object=self.object)
return self.render_to_response(context)

当您最终覆盖如此多的功能时,是否值得为此实际使用通用 View 变得值得怀疑,但您知道。

关于django - 从 Django 中的通用 View DetailView 重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6456586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com