Change Django Templates Based on User-Agent

前端 未结 10 2519
耶瑟儿~
耶瑟儿~ 2020-12-07 11:37

I\'ve made a Django site, but I\'ve drank the Koolaid and I want to make an IPhone version. After putting much thought into I\'ve come up with two options:

相关标签:
10条回答
  • 2020-12-07 11:46

    Rather than changing the template directories dynamically you could modify the request and add a value that lets your view know if the user is on an iphone or not. Then wrap render_to_response (or whatever you are using for creating HttpResponse objects) to grab the iphone version of the template instead of the standard html version if they are using an iphone.

    0 讨论(0)
  • 2020-12-07 11:49

    Detect the user agent in middleware, switch the url bindings, profit!

    How? Django request objects have a .urlconf attribute, which can be set by middleware.

    From django docs:

    Django determines the root URLconf module to use. Ordinarily, this is the value of the ROOT_URLCONF setting, but if the incoming HttpRequest object has an attribute called urlconf (set by middleware request processing), its value will be used in place of the ROOT_URLCONF setting.

    1. In yourproj/middlware.py, write a class that checks the http_user_agent string:

      import re
      MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE)
      class MobileMiddleware(object):
          def process_request(self,request):
              if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']):
                  request.urlconf="yourproj.mobile_urls"
      
    2. Don't forget to add this to MIDDLEWARE_CLASSES in settings.py:

      MIDDLEWARE_CLASSES= [...
          'yourproj.middleware.MobileMiddleware',
      ...]
      
    3. Create a mobile urlconf, yourproj/mobile_urls.py:

      urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
      
    0 讨论(0)
  • 2020-12-07 11:52

    There is a nice article which explains how to render the same data by different templates http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-django

    You still need to automatically redirect the user to mobile site however and this can be done using several methods (your check_mobile trick will work too)

    0 讨论(0)
  • 2020-12-07 11:54

    I'm developing djangobile, a django mobile extension: http://code.google.com/p/djangobile/

    0 讨论(0)
  • 2020-12-07 11:55

    How about redirecting user to i.xxx.com after parsing his UA in some middleware? I highly doubt that mobile users care how url look like, still they can access your site using main url.

    0 讨论(0)
  • 2020-12-07 11:55

    A simple solution is to create a wrapper around django.shortcuts.render. I put mine in a utils library in the root of my application. The wrapper works by automatically rendering templates in either a "mobile" or "desktop" folder.

    In utils.shortcuts:

    from django.shortcuts import render
    from user_agents import parse
    
    def my_render(request, *args, **kwargs):
      """
      An extension of django.shortcuts.render.
    
      Appends 'mobile/' or 'desktop/' to a given template location
      to render the appropriate template for mobile or desktop
    
      depends on user_agents python library
      https://github.com/selwin/python-user-agents
    
      """
      template_location = args[0]
      args_list = list(args)
    
      ua_string = request.META['HTTP_USER_AGENT']
      user_agent = parse(ua_string)
    
      if user_agent.is_mobile:
          args_list[0] = 'mobile/' + template_location
          args = tuple(args_list)
          return render(request, *args, **kwargs)
      else:
          args_list[0] = 'desktop/' + template_location
          args = tuple(args_list)
          return render(request, *args, **kwargs)
    

    In view:

    from utils.shortcuts import my_render
    
    def home(request):    return my_render(request, 'home.html')
    
    0 讨论(0)
提交回复
热议问题