Device Handling¶
Mezzanine comes with the ability to use different sets of templates depending on the device being used to access the website. For example one set of templates may be used for desktop browsers with a corresponding set of templates being used for mobile phones.
Devices are grouped into types with each type being named after the
sub-directory containing its specific set of templates. Each device is then
defined by a list of strings that could be found in the user agent that
matches the particular device. This mapping of device sub-directory names
to user agent strings is defined in the setting DEVICE_USER_AGENTS:
DEVICE_USER_AGENTS = (
("mobile", ("Android", "BlackBerry", "iPhone")),
("desktop", ("Windows", "Macintosh", "Linux")),
)
Given the above example value for DEVICE_USER_AGENTS, suppose a view or
template referenced the template blog/index.html. If an iPhone made
the request to the website, the template mobile/blog/index.html would
be searched for, and if a Windows OS made the request then the template
desktop/blog/index.html would be searched for.
Note
If the device specific templates don’t exist or a user agent isn’t
matched to any of the device specific strings, then the original
template name (blog/index.html in the above example) will be used
as per usual with Django. This means that supporting device specific
templates is entirely optional.
You can also specify which device should be treated as the default by
defining the setting DEVICE_DEFAULT. For example to ensure templates
for the mobile device group are used even when no matching user agent
is found, simply define the following in your project’s settings
module:
DEVICE_DEFAULT = "mobile"
Mobile Theme¶
Mezzanine includes the app mezzanine.mobile which contains a full
set of default templates and assets for creating a mobile version of
your site. Simply add mezzanine.mobile to your INSTALLED_APPS
setting to use it.
Implementation Considerations¶
Using the DEVICE_USER_AGENTS setting, Mezzanine simply prefixes
any referenced template path with the device specific sub-directory name
if a user agent matches one of the strings specified for the device. For
example if a user agent matches the mobile device set of templates,
a reference to blog/index.html will be changed to the list
["mobile/blog/index.html", "blog/index.html"] under the hood.
To achieve this, the middleware
mezzanine.core.middleware.TemplateForDeviceMiddleware catches Django
TemplateResponse responses, and changes the template list prior to
the response being rendered. As such, any views you implement should
return TemplateResponse objects. The table below lists Mezzanine
versions of Django features that can be used to ensure a
TemplateResponse is returned.
| Django | Mezzanine |
|---|---|
django.shortcuts.render |
mezzanine.utils.views.render |
django.template.Library().inclusion_tag |
mezzanine.template.Library().inclusion_tag |
django.views.generic.simple.direct_to_template |
mezzanine.core.views.direct_to_template |