在Django中,管理移动和桌面网站的最佳方式是什么?

时间:2010-03-07 16:18:49

标签: python css django mobile templates

我希望所有功能都能正常运行,除非它是移动设备,整个网站都会使用一组特定的模板。

另外,如果是移动设备,我想自动检测。如果是这样,那么在整个站点中使用该组模板。

6 个答案:

答案 0 :(得分:9)

有两套模板,一套用于移动,一套用于桌面。将文件名存储在一对字典中,并使用User-agent标头来检测应使用哪个集合。还允许通过会话条目手动选择要使用的站点。

答案 1 :(得分:1)

如果你在你的身体上放置一个类(Django使用类似的东西来指定要使用的列样式),你可以使用相同的模板,但只是使用不同的样式表。我不确定您使用单独模板的主要区别是什么,但这可能会让您减少多次重新编码模板。

答案 2 :(得分:0)

有不同的策略。

如果您有很多视图呈现为Web版本的模板文件,并且不想重写所有视图来检查请求是否来自移动用户代理,那么您最好写一个中间件。

工作流程可能是这样的:

def process request:
  if from_mobile:
    settings.TEMPLATE_DIRS=settings.TEMPLATE_MOBILE_DIRS
  else:
    settings.TEMPLATE_DIRS=settings.TEMPLATE_WEB_DIRS

这里只有一点问题:正如Django Documentation报道的那样,在运行时更改设置是不正确的:http://docs.djangoproject.com/en/dev/topics/settings/#altering-settings-at-runtime

所以你可能想打电话

django.conf.settings.configure(default_settings, **settings)

答案 3 :(得分:0)

答案在很大程度上取决于目标受众的类型。如果您的目标是现代移动浏览器与其桌面版本相当(例如基于WebKit),那么您需要的是具有适当media query的特定样式表(您基本上是为低分辨率而非移动设计)。

如果您的网站(例如航空公司时刻表)必须是最广泛的移动设备,一些运行非常旧/有限的浏览器,则需要完全不同的策略。然后自定义(html)模板可能是最简单的方法。

答案 4 :(得分:0)

您可能需要查看mobilesnifferdjango-bloom,看看它们是否符合您的目的。

答案 5 :(得分:0)

最佳做法:使用minidetector将额外信息添加到请求中,然后使用django的内置请求上下文将其传递给您的模板。

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view_on_mobile_and_desktop(request)
    .....
    render_to_response('regular_template.html', 
                       {'my vars to template':vars}, 
                       context_instance=RequestContext(request))

然后在您的模板中,您可以介绍以下内容:

<html>
  <head>
  {% block head %}
    <title>blah</title>
  {% if request.mobile %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-mobile.css">
  {% else %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-desktop.css">
  {% endif %}
  </head>
  <body>
    <div id="navigation">
      {% include "_navigation.html" %}
    </div>
    {% if not request.mobile %}
    <div id="sidebar">
      <p> sidebar content not fit for mobile </p>
    </div>
    {% endif %>
    <div id="content">
      <article>
        {% if not request.mobile %}
        <aside>
          <p> aside content </p>
        </aside>
        {% endif %}
        <p> article content </p>
      </aricle>
    </div>
  </body>
</html>