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

标签 django generics seo views

我正在使用 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/

相关文章:

url - .htaccess RewriteRule 将目录类型的 URL 结构转换为查询

python - 在 Django 中批量创建相关模型

python - Django 清理密码 'ValidationError' 对象没有属性 'get'

python - 如何获取从 django.template 导入的 RequestContext 字典

c# - Fluent 和 NHibernate 的泛型

objective-c - 指定 NSDictionary 条目的值类型

seo - Heroku 子域重复内容?如何重定向到域?

javascript - Django + Javascript + "onmouseover"

Java 通用层次结构定义

php - 我怎样才能在 PHP 中找到所有内容,直到找到其他内容并将其作为字符串返回?