Djangoサイトを作成しましたが、Koolaidを飲んだので、IPhoneバージョンを作成したいと思います。私は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:
テンプレートディレクトリを動的に変更するのではなく、リクエストを変更して、ユーザーがiPhoneを使用しているかどうかをビューに知らせる値を追加できます。次に、render_to_response(またはHttpResponseオブジェクトの作成に使用しているもの)をラップして、iphoneを使用している場合は標準のhtmlバージョンではなくiphoneバージョンのテンプレートを取得します。
ミドルウェアでユーザーエージェントを検出し、URLバインディングを切り替えて、利益を上げましょう!
どうやって? Djangoリクエストオブジェクトには.urlconf属性があり、ミドルウェアで設定できます。
From Django docs:
Djangoは、使用するルートURLconfモジュールを決定します。通常、これはROOT_URLCONF設定の値ですが、着信HttpRequestオブジェクトにurlconf(ミドルウェア要求処理によって設定される)という属性がある場合、その値がROOT_URLCONF設定の代わりに使用されます。
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"
これをsettings.pyのMIDDLEWARE_CLASSESに追加することを忘れないでください。
MIDDLEWARE_CLASSES= [...
'yourproj.middleware.MobileMiddleware',
...]
モバイルURLconf、yourproj /mobile_urls.pyを作成します。
urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
この記事は役に立つかもしれません: モバイルでデスクトップに優しいアプリケーションをDjango 15分で
異なるテンプレートで同じデータをレンダリングする方法を説明する素晴らしい記事があります http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-Django
ただし、ユーザーをモバイルサイトに自動的にリダイレクトする必要があります。これは、いくつかの方法を使用して実行できます(check_mobileトリックも機能します)
他の方法は、ユーザーエージェントに固有のテンプレートをロードする独自のテンプレートローダーを作成することです。これはかなり一般的な手法であり、要求された言語(既存のDjango i18n機械)の優れたコンパニオン)など、他の要因に応じてロードする必要のあるテンプレートを動的に決定するために使用できます。
Django Bookには このテーマに関するセクション があります。
Django-mobileadmin ソースコードを確認する必要があります。これにより、この問題が正確に解決されました。
ミドルウェアでUAを解析した後、ユーザーをi.xxx.comにリダイレクトするのはどうですか?モバイルユーザーが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')