【问题标题】:How can my Django views know which template to render, or whether to return JSON?我的 Django 视图如何知道要呈现哪个模板,或者是否返回 JSON?
【发布时间】:2010-02-07 06:04:29
【问题描述】:

可以通过完整的浏览器、移动浏览器和定制的 iPhone 应用程序访问我们的网站。由于无论客户端如何,逻辑都基本相同,因此我们使用相同的视图来处理所有类型的请求。但在我们的每一个观点的底部,我们都有这样的东西:

if request.is_mobile():
    return render_to_response('foo/bar/baz_mobile.html', context)
elif request.is_api():
    return json.dumps(context)
else:
    return render_to_response('foo/bar/baz.html', context)

显然有更好的方法来做到这一点:)

我想过让我们的视图返回上下文字典,并将它们包装在一个装饰器中,该装饰器决定如何呈现响应。或者,也许我可以对基于类的视图做一些事情。

你会怎么做?

【问题讨论】:

    标签: json django templates response django-context


    【解决方案1】:

    有一个返回字典的函数,然后有两个视图,一个将其编码为 JSON,另一个将其推入模板。

    【讨论】:

    • 如何选择要使用的视图?目前,所有三种客户端类型(桌面、移动、iphone 应用程序)都通过相同的 URL 访问视图。然后视图使用 HTTP_HOST 标头来确定如何呈现响应。如果我对每种响应类型都有单独的视图,我不确定如何确定将特定请求路由到哪个视图。
    • 创建一个查看各种标题(用户代理等)的视图,并根据需要路由到其他视图之一。
    【解决方案2】:

    伊格纳西奥·巴斯克斯-艾布拉姆斯是对的。

    正如您所说,逻辑大体相同——但逻辑不是视图。根据原始 MVC 论文:“视图是其模型的(视觉)表示”。所以你应该有不同的视图用于不同的目的,共享相同的逻辑。

    【讨论】:

    • Django 中的“视图”与该术语的通常 MVC 用法不同。 Django 视图更接近于通常意义上的控制器,模板更接近于视图。
    【解决方案3】:

    如此处所述:

    http://docs.djangoproject.com/en/dev/ref/request-response/#attributes

    因此,将视图中的请求参数包含到模板的上下文中:

    @auto_render
    def base_index(request, template_name="desktop-home.html") :
      user_agent = request.META["HTTP_USER_AGENT"]
      if "mobile" in user_agent :
        template_name = "mobile-home.html"
    
      return template_name, {
        "Navigation" : NavigationManager.db,
        "Headers"    : request
      }
    

    因此在您的模板中提供:

    {{ Headers.META.HTTP_USER_AGENT }}
    

    哪些报告:

    Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Ubuntu/10.04 Chromium/8.0.552.237 Chrome/8.0.552.237 Safari/534.10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2011-12-17
      • 2014-11-26
      • 2013-06-06
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多