首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Django中的通用视图DetailView重定向

从Django中的通用视图DetailView重定向
EN

Stack Overflow用户
提问于 2011-06-23 23:26:26
回答 2查看 6.1K关注 0票数 17

我正在使用Django的基于类的DetailView泛型视图来查找要显示的对象。在某些情况下,我不想显示对象,而是希望退出并发出HTTP rediect。我不知道我该怎么做。它用于当用户点击我的应用程序中的对象时,但不使用规范的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查找的对象的正确规范网址。

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

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

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

谢谢!

鲁多。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-23 23:57:18

这并不适合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)

当你最终覆盖了如此多的功能时,是否值得为此使用通用视图就成了一个问题,但你知道的。

票数 16
EN

Stack Overflow用户

发布于 2012-10-12 19:29:54

根据Rolo的回答和评论,我提出了以下通用观点来服务于此目的:

from django import http
from django.views import generic


class CanonicalDetailView(generic.DetailView):
    """
        A DetailView which redirects to the absolute_url, if necessary.
    """
    def get_object(self, *args, **kwargs):
        # Return any previously-cached object
        if getattr(self, 'object', None):
            return self.object
        return super(CanonicalDetailView, self).get_object(*args, **kwargs)

    def get(self, *args, **kwargs):
        # Make sure to use the canonical URL
        self.object = self.get_object()
        obj_url = self.object.get_absolute_url()
        if self.request.path != obj_url:
            return http.HttpResponsePermanentRedirect(obj_url)
        return super(CanonicalDetailView, self).get(*args, **kwargs);

它的使用方式与普通的DetailView相同,并且应该适用于任何正确实现get_absolute_url的模型。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6456586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档