2010-02-23 10 views
32

Ho un'applicazione web scritta in Django che ha una pagina specifica che mi piacerebbe implementare una versione mobile del modello (e una logica leggermente diversa) per. Mi piacerebbe essere in grado di attuarla ala questo codice sudo:Rileva browser mobile (non solo iPhone) in vista python

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) 

Non ho una quantità enorme di tempo e sono abbastanza presto nella mia curva di apprendimento di codifica :) - ho trovato quello sembra essere un'app pluggable molto potente chiamata bloom per ottenere capacità del dispositivo mobile - http://code.google.com/p/django-bloom/wiki/BloomDevice Tuttavia sembra che faccia una richiesta tramite JSON per ottenere molte specifiche del dispositivo che non mi servono, il che mi sembra un po 'inefficiente.

Qualcuno ha un suggerimento metodo più semplice? La mia rilevazione non deve essere al 100%, solo iPhone, iPod, Android e dispositivi mainstream ...

La stringa http_user_agent ha una sorta di flag mobile che posso controllare?

+0

errore di battitura: sudo = pseudo – pmont

risposta

19

Aggiornamento:

Ho appena trovato: http://code.google.com/p/minidetector/

che sembra fare esattamente quello che voglio, ho intenzione di provare ora. Sentiti libero di dirmi che ho torto!

+0

Grazie per la condivisione che trovano. Per me, quello che il middleware sembra essere una soluzione migliore di tutti quelli che ho usato per raggiungere scopi simili. – ayaz

+2

Questo progetto è aggiornato? Non ha visto un cambiamento da dicembre 2010. Stavo usando https://github.com/shelfworthy/minidetector invece da quando è stato sviluppato attivamente. Sfortunatamente l'autore mi ha appena detto che non è più supportato e ha intenzione di eliminare quel repository Github quindi sto cercando un sostituto. –

+0

Se si controlla la rete per minidector ci sono un paio di forche che non sono così stanti - https://github.com/saschwarz/minidetector/network – Alvin

15

best practice: utilizzare minidetector per aggiungere le informazioni aggiuntive alla richiesta, quindi utilizzare il contesto di richiesta incorporato di django per passarlo ai propri modelli in questo modo.

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

poi nel vostro modello che si sono in grado di introdurre cose del genere:

<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

Molte persone seguono questa convenzione, anche se non mi piace perché costringe gli sviluppatori ad avere una moltitudine di affermazioni if ​​invece di solo 1. Si può sostenere che la visualizzazione di modelli diversi non sia SECCOSA, ma penso che la sanità di separare le due valga la pena. – Mikhail

7

andare per la forcella di minidetecor chiamato django-mobi, include documentazione su come usarlo.

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

+0

Questa sembra la soluzione migliore. __ "Descrizione forchetta: ho riorganizzato il codice, aggiunto il caching e apportato alcune modifiche qua e là." __ – Druska

Problemi correlati