4

我们的网站可以通过完整的浏览器、移动浏览器和定制的 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)

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

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

你会怎么做?

4

3 回答 3

3

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

于 2010-02-07T06:09:20.200 回答
1

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

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

于 2010-02-07T07:10:33.973 回答
0

如此处所述:

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
于 2011-02-04T14:12:24.930 回答