Changement de Django Modèles en Fonction de l'Agent Utilisateur
J'ai fait un site Django, mais j'ai bu le Koolaid et je veux faire un IPhone version. Après avoir mis beaucoup de pensée dans je suis venu avec deux options:
- Faire tout un autre site, comme i.xxxx.com. L'attacher dans la même base de données à l'aide de Django reinhardt, les sites de cadre.
- Trouver un peu de temps de middleware qui lit le user-agent, et change le modèle des répertoires de manière dynamique.
J'aimerais vraiment préférez l'option #2, cependant, j'ai quelques réserves, principalement parce que la documentation de Django décourage la modification des paramètres à la volée. J'ai trouvé un extrait de qui permettrait de faire ce que je voudrais. Mon principal problème est d'avoir la plus transparente possible, j'aimerais qu'il soit automagic et transparente pour l'utilisateur.
Quelqu'un d'autre a rencontré le même problème? Quelqu'un aurait-il des soins à partager sur la façon dont ils ont abordé faire IPhone versions de Django sites?
Mise à jour
Je suis allé avec une combinaison de middleware et de peaufiner le modèle d'appel.
Pour le middleware, j'ai utilisé minidetector. Je l'aime parce qu'il détecte un pléthore de mobile user-agents. Tout ce que j'ai à faire est de vérifier la demande.mobile de mon point de vue.
Pour le modèle d'appel tweak:
def check_mobile(request, template_name):
if request.mobile:
return 'mobile-%s'%template_name
return template_name
- Je l'utiliser pour n'importe quelle vue que je sais que j'ai les deux versions.
TODO:
- Comprendre comment l'accès demande.mobile dans une version étendue de render_to_response donc je n'ai pas à utiliser check_mobile('template_name.html')
- À l'aide de la précédente automatiquement de secours pour le template classique si pas de version mobile existe.
- Vous pouvez également faire/besoin de cela pour avoir un spécial IE6 version des modèles. Je pense en utilisant 1 modèle, avec certaines conditions si l'agent utilisateur est IE6.
- J'aime la façon dont vous l'avez fait 🙂 voulez-vous dire que j'ai une pléthore de pinatas?
- Notez que malheureusement, minidetector ne semble pas être compatible avec Python 3. Voir ce DONC, la question pour des solutions de rechange.
Vous devez vous connecter pour publier un commentaire.
Plutôt que de changer le modèle des répertoires de manière dynamique, vous pourriez modifier la demande et d'ajouter une valeur qui permet à votre vue de savoir si l'utilisateur est sur un iphone ou pas. Puis les envelopper render_to_response (ou ce que vous utilisez pour la création de HttpResponse objets) pour sélectionner la version iphone du modèle au lieu de la norme html version si elles sont à l'aide d'un iphone.
from my_site_wide_stuff.utils import my_render_to_response as render_to_response
- depuisrender_to_response
n'est qu'un raccourci de toute façon. Bien que la fonction rechercher/remplacer est probablement la voie à suivre 😉Détecter l'agent de l'utilisateur dans le middleware, mettez l'url de liaisons, de profit!
Comment? Django demande les objets ont une .urlconf attribut, qui peut être définie par le middleware.
De django docs:
Dans yourproj/middlware.py, écrire une classe qui vérifie la http_user_agent chaîne:
N'oubliez pas de l'ajouter à MIDDLEWARE_CLASSES dans settings.py:
Créer un mobile urlconf, yourproj/mobile_urls.py:
Cet article pourrait être utile: Construire un pc de Bureau et portables-Application Conviviale dans Django en 15 Minutes
Je suis le développement de djangobile, un django extension mobile: http://code.google.com/p/djangobile/
Vous devriez jeter un oeil à la django-mobileadmin code source, qui a résolu ce problème.
Autre moyen serait de créer votre propre modèle de chargeur qui charge les modèles spécifiques à l'agent utilisateur. C'est assez technique générique et peut être utilisé pour déterminer de manière dynamique ce modèle doit être chargé en fonction d'autres facteurs, tels que la langue demandée (bon compagnon existant Django i18n machines).
Django Livre a un l'article sur ce sujet.
Il y a un bel article qui explique comment rendre les mêmes données en différents modèles
http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-django
Vous avez encore besoin de rediriger automatiquement l'utilisateur au site mobile, cependant, et cela peut être fait à l'aide de plusieurs méthodes (votre check_mobile astuce sera trop de travail)
Comment rediriger l'utilisateur vers i.xxx.com après l'analyse de son UC dans certains middleware? Je doute fortement que les utilisateurs mobiles de soins de la façon dont l'url ressemble, encore qu'ils peuvent accéder à votre site en utilisant l'url principale.
meilleur scénario possible: utiliser minidetector pour ajouter des informations supplémentaires à la demande, à l'utilisation de django reinhardt, construit dans le contexte de demande de passer à des modèles comme
puis dans votre modèle, vous êtes en mesure d'introduire des trucs comme:
Une solution simple est de créer un wrapper autour de
django.shortcuts.render
. J'ai mis le mien dans unutils
de la bibliothèque dans la racine de mon application. Le wrapper automatiquement des modèles de rendu dans un "mobile" ou "desktop" le dossier.Dans
utils.shortcuts
:Dans
view
: