سؤال

لقد قدم جانغو الموقع, ولكن لقد شربت كوليد وأنا تريد أن تجعل اي فون الإصدار.بعد وضع الكثير من التفكير في أنني قد يأتي مع اثنين من الخيارات:

  1. تجعل كل موقع آخر ، مثل i.xxxx.com.التعادل في نفس قاعدة البيانات باستخدام جانغو مواقع الإطار.
  2. تجد بعض الوقت الوسيطة أن يقرأ وكيل المستخدم ، والتغيرات الدلائل قالب حيوي.

أنا حقا يفضل الخيار #2, ومع ذلك ؛ لدي بعض التحفظات ، وذلك أساسا بسبب جانغو الوثائق يشجع تغيير الإعدادات على الطاير.وجدت مقتطف التي من شأنها أن تفعل ما أريد.بلدي المسألة الرئيسية هي وجود لها قدر الإمكان ، أود أن يكون automagic و شفافا بالنسبة للمستخدم.

وقد أي شخص آخر تأتي عبر نفس المشكلة ؟ هل لأحد أن حصة عن كيف أنها قد تناولت جعل اي فون إصدارات جانغو المواقع ؟

التحديث

ذهبت مع مجموعة من الوسيطة و التغيير والتبديل في قالب الدعوة.

من أجل الوسيطة ، كنت minidetector.أنا أحب ذلك لأنه يكشف كبير المحمول وكلاء المستخدم.كل ما عليك القيام به هو التحقق من الطلب.المحمول في وجهات النظر.

قالب دعوة القرص:

 def check_mobile(request, template_name):
     if request.mobile:
         return 'mobile-%s'%template_name
     return template_name

يمكنني استخدام هذا لأي عرض أعرف أنني كلا الإصدارين.

ما يجب عمله:

  • معرفة كيفية الوصول طلب.المحمول في نسخة موسعة من render_to_response حتى لا تضطر إلى استخدام check_mobile('template_name.html')
  • باستخدام السابق التلقائى تراجع العادية القالب إذا لم يوجد نسخة الجوال موجود.
هل كانت مفيدة؟

المحلول

بدلاً من تغيير أدلة القالب ديناميكيًا، يمكنك تعديل الطلب وإضافة قيمة تتيح لعرضك معرفة ما إذا كان المستخدم يستخدم هاتف iPhone أم لا.ثم قم بلف render_to_response (أو أي شيء تستخدمه لإنشاء كائنات HttpResponse) للحصول على نسخة iPhone من القالب بدلاً من إصدار html القياسي إذا كانوا يستخدمون iPhone.

نصائح أخرى

كشف وكيل المستخدم في الوسيطة ، التبديل url الروابط, الربح!

كيف ؟ جانغو طلب الكائنات لديها .urlconf السمة التي يمكن تعيينها من قبل الوسيطة.

من جانغو مستندات:

جانغو يحدد الجذر URLconf وحدة للاستخدام.عادة, هذا هو قيمة ROOT_URLCONF الإعداد ، ولكن إذا كانت واردة HttpRequest كائن له سمة يسمى urlconf (التي حددتها الوسيطة معالجة الطلب) ، القيمة التي سيتم استخدامها في مكان ROOT_URLCONF الإعداد.

  1. في yourproj/middlware.py, كتابة الدرجة التي يتحقق http_user_agent سلسلة:

    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. لا تنس أن تضيف هذا إلى MIDDLEWARE_CLASSES في settings.py:

    MIDDLEWARE_CLASSES= [...
        'yourproj.middleware.MobileMiddleware',
    ...]
    
  3. إنشاء المحمول urlconf, yourproj/mobile_urls.py:

    urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
    

أقوم بتطوير djangobile، وهو امتداد django للجوال: http://code.google.com/p/djangobile/

يجب عليك إلقاء نظرة على django-mobileadmin كود المصدر، الذي حل هذه المشكلة بالضبط.

هناك طريقة أخرى تتمثل في إنشاء أداة تحميل القوالب الخاصة بك والتي تقوم بتحميل القوالب الخاصة بوكيل المستخدم.هذه تقنية عامة جدًا ويمكن استخدامها لتحديد القالب الذي يجب تحميله ديناميكيًا اعتمادًا على عوامل أخرى أيضًا، مثل اللغة المطلوبة (رفيق جيد لآلات Django i18n الموجودة).

يحتوي كتاب جانغو على قسم حول هذا الموضوع.

هناك مقالة لطيفة تشرح كيفية عرض نفس البيانات باستخدام قوالب مختلفةhttp://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-Django

لا تزال بحاجة إلى إعادة توجيه المستخدم تلقائيًا إلى موقع الهاتف المحمول، ويمكن القيام بذلك باستخدام عدة طرق (ستعمل خدعة check_mobile الخاصة بك أيضًا)

ماذا عن إعادة توجيه المستخدم إلى i.xxx.com بعد تحليل UA الخاص به في بعض البرامج الوسيطة؟أشك بشدة في أن مستخدمي الهاتف المحمول يهتمون بالشكل الذي يبدو عليه عنوان url، ولا يزال بإمكانهم الوصول إلى موقعك باستخدام عنوان url الرئيسي.

أفضل سيناريو ممكن:استخدم minidetector لإضافة المعلومات الإضافية إلى الطلب، ثم استخدم سياق الطلب المدمج في Django لتمريرها إلى القوالب الخاصة بك مثل ذلك

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

ثم في القالب الخاص بك، يمكنك تقديم أشياء مثل:

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

الحل البسيط هو إنشاء غلاف حوله django.shortcuts.render.لقد وضعت الألغام في utils المكتبة في جذر طلبي.يعمل المجمع عن طريق عرض القوالب تلقائيًا في مجلد "الجوال" أو "سطح المكتب".

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

في view:

from utils.shortcuts import my_render

def home(request):    return my_render(request, 'home.html')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top