2011-08-07 16 views
4

クライアントアカウントの作成とログインにdjango authに沿ってdjango-registrationを使用しています。モバイルブロッサーと一緒に使用するdjango-registrationを変更する場所

私たちのサイトは、mobleユーザーとデスクトップユーザーによって使用されます。私たちは、ユーザーエージェントの文字列に応じてビューから異なるテンプレートを読み込むことで、モバイルユーザーのアイデアに取り掛かり始めました。それはきちんと完了しましたが、私たちが今すぐにアクセスできない(私たちは自分自身を書いていない)ビューで何をすべきかに固執しているので、それが正しい方法であるかどうかはわかりません。

私は手元の問題につながります。 django-registration/authが(デスクトップ版)に送信するログインURLからモバイルユーザーをリダイレクトする方法についてはわかりません。

私は戦術を変えて、テンプレートファイル自体のさまざまなブラウザに取り組むことができました。それは面倒な速さになるように感じる。私はそのアイデアがまったく好きではありません!

また、ユーザーエージェント文字列に基づいてさまざまなテンプレートを使用してリクエストをレンダリングする、現在の方法にとどまります。それから、私はdjango登録(ユーザエージェント文字列に基づいて別のテンプレートセットをロードする方法)をどう扱うべきかを知る必要があります。更新モジュールを簡単にするだけなら、私はむしろジャンゴ登録コードを変更しません。

答えて

2

django登録テンプレートは非常に単純で非常にまれにしか使用されません。私はこれらを特殊なケースとして扱い、両方のプラットフォームでうまく動作するようにbase.htmlを作成します。

登録ページは非常にシンプルに見えますが、多くのサイトでこれが行われており、予期しないことではありません。

もう1つの選択肢は、モバイルディレクトリであるかどうかを検出することに基づいてテンプレートディレクトリを設定するミドルウェアです。あなたはこのDetect mobile browser (not just iPhone) in python viewのようなモバイルブラウザを検出して、TEMPLATE_DIRSを更新するには、このような何かをmake_tls_propertyトリックを使用していますミドルウェア持つことができます。djangotoolboxの一部であるだけで明確にするために

TEMPLATE_DIRS = settings.__dict__['_wrapped'].__class__.TEMPLATE_DIRS = make_tls_property(settings.TEMPLATE_DIRS) 

class MobileMiddleware(object): 
    """Sets settings.SITE_ID based on request's domain""" 
    def process_request(self, request): 
     if *mobile*: 
      TEMPLATE_DIRS.value = *mobiletemplates* + settings.BASE_TEMPLATE_DIRS 
     else: 
      TEMPLATE_DIRS.value = *normaltemplates* + settings.BASE_TEMPLATE_DIRS 

、make_tls_propertyを、TEMPLATE_DIRSを作りますグローバル変数の代わりにスレッドごとの変数を設定して、各リクエスト応答ループがそれ自身の変数の「バージョン」を取得するようにします。

+0

近いため良い答えしかし、一般的な問題は、ある時点では、何らかの理由で実際に別のテンプレートをロードしたいと思うかもしれません。 – michael

+0

私の拡張答えを見てください。 –

+0

驚くべきことに、今は非常に基本的なログインを使用します(最初の提案)が、必要に応じて将来の使用のためにミドルウェアの提案を試してみます。 – michael

2

一つの方法は、単純にハードワークを行うにはジャンゴ・登録画面を呼び出し、独自のログインビューを書くことですが、それをコンテキストに応じて別のテンプレートを渡す:

def login(request, *args, **kwargs): 
    my_kwargs = kwargs.copy() 
    if <mobile condition>: 
     my_kwargs['template_name'] = 'my_app/some_template.html' 
    else: 
     my_kwargs['template_name'] = 'my_app/some_other_template.html' 

    from django.contrib import auth 
    return auth.login(request, *args, **my_kwargs) 
関連する問題