I am struggling to find an easy way to detect if the request comes from a mobile device in my Django views.
I am trying to implement something like this:
#views.py  def myfunction(request):      ...     if request.mobile:         is_mobile = True     else:         is_mobile = False      context = {         ... ,         'is_mobile': is_mobile,     }     return render(request, 'mytemplate.html', context)   And in mytemplate.html:
{% if is_mobile %}         show something {% else %}     show something else {% endif %}   Everywhere I checked (for instance here or here), minidetector is recommended. I have installed different versions: pip install minidetector, pip install minidetector2, as well as directly a couple of github repositories, but none of them are compatible with Python 3.
So here my question: Is there any version/fork of minidetector that is compatible with Python 3? If not, what are the alternatives?
Django User Agents package is compatible with Python 3.
Follow the installation instructions in the link provided above and then you can use it as follows:
def my_view(request):      # Let's assume that the visitor uses an iPhone...     request.user_agent.is_mobile # returns True     request.user_agent.is_tablet # returns False     request.user_agent.is_touch_capable # returns True     request.user_agent.is_pc # returns False     request.user_agent.is_bot # returns False      # Accessing user agent's browser attributes     request.user_agent.browser  # returns Browser(family=u'Mobile Safari', version=(5, 1), version_string='5.1')     request.user_agent.browser.family  # returns 'Mobile Safari'     request.user_agent.browser.version  # returns (5, 1)     request.user_agent.browser.version_string   # returns '5.1'      # Operating System properties     request.user_agent.os  # returns OperatingSystem(family=u'iOS', version=(5, 1), version_string='5.1')     request.user_agent.os.family  # returns 'iOS'     request.user_agent.os.version  # returns (5, 1)     request.user_agent.os.version_string  # returns '5.1'      # Device properties     request.user_agent.device  # returns Device(family='iPhone')     request.user_agent.device.family  # returns 'iPhone'   The usage in template is as follows:
{% if request.user_agent.is_mobile %}     Do stuff here... {% endif %}   However, note that the middleware class has changed in Django 1.10. So if you are using Django 1.10 +, you will have to modify the middleware class definition in this Package as given in this GitHub issue tracker page.
I found an alternative way, starting from this answer.
By adding an additional function into views.py:
import re  def mobile(request): """Return True if the request comes from a mobile device."""      MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE)      if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']):         return True     else:         return False   def myfunction(request):      ...     if mobile(request):         is_mobile = True     else:         is_mobile = False      context = {         ... ,         'is_mobile': is_mobile,     }     return render(request, 'mytemplate.html', context) 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With