2010-02-23 17 views
32

Tengo una aplicación web escrita en Django que tiene una página específica para la que me gustaría implementar una versión móvil de la plantilla (y una lógica ligeramente diferente) para. Me gustaría ser capaz de ponerlo en práctica ala este código sudo:Detectar navegador móvil (no solo iPhone) en python view

def(myView) 

    do some stuff 

    if user-is-on-a-mobile-device: 
    do some stuff 
    return (my mobile template) 

    else: 
    do some stuff 
    return (my normal template) 

que no tienen una gran cantidad de tiempo y estoy bastante temprano en mi curva de aprendizaje de codificación :) - He encontrado lo parece ser una aplicación enchufable muy poderosa llamada bloom para obtener capacidades de dispositivos móviles - http://code.google.com/p/django-bloom/wiki/BloomDevice Sin embargo, parece hacer una solicitud a través de JSON para obtener muchas especificaciones del dispositivo que no necesito, lo cual me parece un poco ineficiente.

¿Alguien tiene un método sugerido más simple? Mi detección no necesita ser 100%, solo iPhone, iPod, Android y dispositivos convencionales ...

¿La cadena http_user_agent tiene algún tipo de indicador móvil que pueda verificar?

+0

errata: sudo = seudo – pmont

Respuesta

19

Actualización:

simplemente he encontrado: http://code.google.com/p/minidetector/

que parece hacer exactamente lo que quiero, voy a probar ahora. ¡Siéntete libre de decirme que estoy equivocado!

+0

Gracias por compartir que encontrar. Para mí, lo que hace ese middleware parece ser una mejor solución que todos los de fabricación casera que he usado para lograr propósitos similares. – ayaz

+2

¿Está ese proyecto actualizado? No ha visto un cambio desde diciembre de 2010. En su lugar, estaba usando https://github.com/shelfworthy/minidetector desde que se desarrolló activamente. Lamentablemente, el autor me acaba de decir que ya no es compatible y ha querido eliminar ese repositorio de github, así que estoy buscando un reemplazo. –

+0

Si busca en la red un minidector, hay un par de horquillas que no son tan anticuadas: https://github.com/saschwarz/minidetector/network – Alvin

15

mejor práctica: use minidetector para agregar la información adicional a la solicitud, luego use el contexto de solicitud incorporado de django para pasarlo a sus plantillas de esa manera.

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)) 

entonces en su plantilla que son capaces de introducir cosas como:

<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> 
+1

Mucha gente sigue esta convención, aunque no me gusta porque obliga a los desarrolladores a tener una multitud de sentencias if en lugar de solo 1. Puedes argumentar que mostrar diferentes plantillas por completo no es DRY, pero creo que la cordura de separarlas vale la pena. – Mikhail

7

ir para el tenedor de minidetecor llamado Django-mobi, que incluye documentación sobre cómo usarlo.

https://pypi.python.org/pypi/django-mobi

+0

Esta parece ser la mejor solución. __ "Descripción de la horquilla: reorganicé el código, agregué el almacenamiento en caché e hice algunos ajustes aquí y allá". – Druska

Cuestiones relacionadas