我希望所有功能都能正常运行,除非它是移动设备,整个网站都会使用一组特定的模板。
另外,如果是移动设备,我想自动检测。如果是这样,那么在整个站点中使用该组模板。
答案 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)
您可能需要查看mobilesniffer和django-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>