40

Djangoのサイトを作ったことがあるのですが、クーレイドを飲んでしまったのでiPhone版を作りたいと思っています。よく考えた結果、次の 2 つのオプションを思いつきました。

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

ただし、オプション 2 の方が望ましいと思います。主に、Django のドキュメントがその場で設定を変更することを推奨していないため、いくつかの留保があります。私がやりたいことをするスニペットを見つけました。私の主な問題は、それを可能な限りシームレスにすることです。自動でユーザーに透過的にしたいと思います。

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

アップデート

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

ミドルウェアにはminidetectorを使用しました。大量のモバイル ユーザー エージェントを検出するので、気に入っています。ビューで request.mobile を確認するだけです。

テンプレート呼び出しの微調整:

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

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

TODO:

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

9 に答える 9

20

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

于 2008-10-02T20:44:38.020 に答える
14

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

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

ジャンゴのドキュメントから:

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'), ...)
    
于 2010-08-15T11:57:53.370 に答える
3

django モバイル拡張機能である djangobile を開発しています: http://code.google.com/p/djangobile/

于 2008-10-19T12:46:33.280 に答える
2

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

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

于 2008-11-18T19:06:33.953 に答える
2

この問題を正確に解決したdjango-mobileadminソース コードを確認してください。

于 2008-10-09T22:00:13.650 に答える
2

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

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

于 2008-10-16T09:41:23.410 に答える
1

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

于 2008-10-02T21:08:31.410 に答える
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>
于 2010-11-11T07:43:09.383 に答える
0

簡単な解決策は、 の周りにラッパーを作成すること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')
于 2013-01-24T21:09:45.207 に答える