【问题标题】:In Django, what is the best way to manage both a mobile and desktop site?在 Django 中,管理移动和桌面站点的最佳方式是什么?
【发布时间】:2011-01-24 17:06:32
【问题描述】:

我希望一切都能正常运行,除非它是移动的,否则整个网站将使用一组特定的模板。

另外,我想自动检测它是否是移动的。如果是这样,则在整个站点中使用该组模板。

【问题讨论】:

  • 问题是对于大多数手机来说,一对一映射并不能解决问题。移动设备的屏幕空间(推销 iPhone 和其他 Android 设备)比传统 PC 小得多,并且需要特定的视图(例如将 PC 视图分成 2/3 块)。此外,某些功能在手机/黑莓上可能会很痛苦(浏览器怪癖......)。尽管如此,我还是祝你好运,并希望其他人能够以良好的线索回答这个问题:)

标签: python css django mobile templates


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      最佳实践:使用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>
      

      【讨论】:

        【解决方案4】:

        有不同的策略。

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

        工作流程可能是这样的:

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

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

        所以你可能想打电话

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-19
              • 2022-11-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多