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:

  1. 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.
  2. 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.