2012-11-12 13 views
7

Ich verwende bereits eine Geräteerkennung (http://djangosnippets.org/snippets/2228/) in meinen Vorlagen und versuche, sie auch in Ansichten zu verwenden, sodass ich zum App Store umleiten kann, wenn ein Benutzer von einem iPhone kommt.Django - Mobilgerät in Sichten erkennen

So hatte ich schon:

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 } 

und erstellt dann eine Klasse in Werkzeuge/middleware.py:

from tools.context_processor import mobile 

class detect_device(object): 

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

     request.device = device 

hinzugefügt folgendes MIDDLEWARE_CLASSES im settings.py:

'tools.middleware.detect_device' 

Und in views.py habe ich erstellt:

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

Aber ich erhalte die Fehlermeldung:

'dict' object has no attribute 'iphone'

+0

FYI ', find' einen Index des ersten Treffers zurück, so dass es theoretisch 0. Ihre Kontrollen sollten so' wenn ua.find ("iphone") aussehen zurückkehren kann> - 1 statt, wie es -1 für keine Übereinstimmung zurückgibt. –

Antwort

8

Es ist ein Wörterbuch, keine Klasse.

Komplettansicht:

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

Danke, fast korrekt, aber wenn Sie zu - wenn 'iphone' in request.device ['Gerät'] ändern - dann werde ich Sie stimmen :) – Christoffer

+0

Sie haben Recht, sorry. Freut mich, dass es dir nützlich war. – santiagobasulto

Verwandte Themen