web-dev-qa-db-ja.com

変更Django User-Agentに基づくテンプレート

Djangoサイトを作成しましたが、Koolaidを飲んだので、IPhoneバージョンを作成したいと思います。私は2つのオプションを考え出しました:

  1. I.xxxx.comのような他のサイト全体を作成します。 Djangoのサイトフレームワークを使用して、同じデータベースに接続します。
  2. ユーザーエージェントを読み取り、テンプレートディレクトリを動的に変更するミドルウェアの時間を見つけます。

ただし、オプション#2の方が本当に好きです。主にDjangoドキュメント その場で設定を変更することをお勧めしません 。私が見つけた スニペット 私の主な問題は、可能な限りシームレスにすることです。自動マジックであり、ユーザーに対して透過的であることを望んでいます。

他の誰かが同じ問題に遭遇しましたか? DjangoサイトのiPhoneバージョンの作成にどのように取り組んだかについて誰かが共有したいと思いますか?

更新

ミドルウェアとテンプレート呼び出しの調整を組み合わせて使用​​しました。

ミドルウェアには minidetector を使用しました。 plethora のモバイルユーザーエージェントを検出するので、私はそれが好きです。私がしなければならないのは、私の見解でrequest.mobileをチェックすることだけです。

テンプレートについては、Tweakを呼び出します。

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

私は両方のバージョンがあることがわかっているすべてのビューにこれを使用します。

TODO:

  • Render_to_responseの拡張バージョンでrequest.mobileにアクセスする方法を理解して、check_mobile( 'template_name.html')を使用する必要がないようにします。
  • モバイルバージョンが存在しない場合は、以前の自動で通常のテンプレートにフォールバックします。
40
imjoevasquez

テンプレートディレクトリを動的に変更するのではなく、リクエストを変更して、ユーザーがiPhoneを使用しているかどうかをビューに知らせる値を追加できます。次に、render_to_response(またはHttpResponseオブジェクトの作成に使用しているもの)をラップして、iphoneを使用している場合は標準のhtmlバージョンではなくiphoneバージョンのテンプレートを取得します。

20
Aaron

ミドルウェアでユーザーエージェントを検出し、URLバインディングを切り替えて、利益を上げましょう!

どうやって? Djangoリクエストオブジェクトには.urlconf属性があり、ミドルウェアで設定できます。

From Django docs:

Djangoは、使用するルート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. これをsettings.pyのMIDDLEWARE_CLASSESに追加することを忘れないでください。

    MIDDLEWARE_CLASSES= [...
        'yourproj.middleware.MobileMiddleware',
    ...]
    
  3. モバイルURLconf、yourproj /mobile_urls.pyを作成します。

    urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
    
12
4
Swaroop C H

異なるテンプレートで同じデータをレンダリングする方法を説明する素晴らしい記事があります http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-Django

ただし、ユーザーをモバイルサイトに自動的にリダイレクトする必要があります。これは、いくつかの方法を使用して実行できます(check_mobileトリックも機能します)

2
Amit

他の方法は、ユーザーエージェントに固有のテンプレートをロードする独自のテンプレートローダーを作成することです。これはかなり一般的な手法であり、要求された言語(既存のDjango i18n機械)の優れたコンパニオン)など、他の要因に応じてロードする必要のあるテンプレートを動的に決定するために使用できます。

Django Bookには このテーマに関するセクション があります。

2
zgoda

Django-mobileadmin ソースコードを確認する必要があります。これにより、この問題が正確に解決されました。

2
ak.

ミドルウェアでUAを解析した後、ユーザーをi.xxx.comにリダイレクトするのはどうですか?モバイルユーザーがURLの外観を気にかけているのではないかと疑っていますが、それでもメインURLを使用してサイトにアクセスできます。

1

考えられる最善のシナリオ: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>
1
Thomas

簡単な解決策は、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')
0
Samora Dake