2012-11-12 15 views
7

Sto già utilizzando un dispositivo di rilevamento (http://djangosnippets.org/snippets/2228/) nei miei modelli e cerco anche di farlo funzionare nelle visualizzazioni, quindi posso reindirizzare all'app store se un utente proviene da un iPhone.Django - rileva il dispositivo mobile nelle viste

Così ho già avuto:

import re 

def mobile(request): 

    device = {} 

    ua = request.META.get('HTTP_USER_AGENT', '').lower() 

    if ua.find("iphone") > 0: 
     device['iphone'] = "iphone" + re.search("iphone os (\d)", ua).groups(0)[0] 

    if ua.find("ipad") > 0: 
     device['ipad'] = "ipad" 

    if ua.find("android") > 0: 
     device['android'] = "android" + re.search("android (\d\.\d)", ua).groups(0)[0].translate(None, '.') 

    # spits out device names for CSS targeting, to be applied to <html> or <body>. 
    device['classes'] = " ".join(v for (k,v) in device.items()) 

    return {'device': device } 

E poi ha creato una classe in strumenti/middleware.py:

from tools.context_processor import mobile 

class detect_device(object): 

    def process_request(self, request): 
     device = mobile(request) 

     request.device = device 

aggiunto il testo seguente MIDDLEWARE_CLASSES nella settings.py:

'tools.middleware.detect_device' 

E in views.py ho creato:

def get_link(request): 
    if request.device.iphone: 
     app_store_link = settings.APP_STORE_LINK 
     return HttpResponseRedirect(app_store_link) 
    else: 
     return HttpResponseRedirect('/') 

Ma sto ottenendo l'errore:

'dict' object has no attribute 'iphone'

+0

FYI, 'find' restituisce un indice della prima partita in modo che potrebbe teoricamente tornare 0. Il controllo dovrebbe assomigliare a questa' se ua.find ("iphone")> - 1' invece, poiché restituisce -1 per nessuna corrispondenza. –

risposta

8

si tratta di un dizionario, non è una classe.

vista Completa:

def get_link(request): 
    if 'iphone' in request.device['device']: 
     app_store_link = settings.APP_STORE_LINK 
     return HttpResponseRedirect(app_store_link) 
    else: 
     return HttpResponseRedirect('/') 
+2

Grazie, quasi corretto, ma se cambierai - se 'iphone' in request.device ['device'] - allora ti voterò :) – Christoffer

+0

Hai ragione, mi dispiace. Sono contento che ti sia stato utile. – santiagobasulto

Problemi correlati