2

新しいタイプのユーザー プロファイルをサイトに追加していますが、この新しいタイプのユーザー (new_type など) は、既存のユーザーと同じビューにアクセスできないはずです。

私の質問は、追加のような既存のビューコードを変更せずに、同じリクエストパスを使用してユーザータイプに応じて異なるタイプのビューを使用するにはどうすればよいですか?

if user.profile_type == 'blah':
    do_this 
else: 
    do_that 

各ビューに?

詳細に:

両方のタイプのユーザーに「http://mysite.com/path/」を使用して、異なるロジックを実行し、既存のビューに違いを生じさせずに異なる表示を返したいと思います (変更するビューがたくさんあるため)。

新しいタイプのビューのさまざまなグループを追加し、URL ロジックをオーバーライドして、次のような関連するビューへのリクエスト パスを解決することを考えています。

if user is of new_type 
    resolve path to related_view_for_new_type
else
    resolve as usual 

簡単な例として、同じログイン URL から管理者と通常のユーザーにログインし、ユーザーが管理者の場合は、管理者に関連するビューを実行し、django 管理画面を彼女に返します。通常のユーザーの場合は、通常のビューを実行して通常に戻ります。要求している URL を書き換えたり変更したりせずに、彼女にウェブサイト ビューを表示します。(/index/ 例)

そのような方法でDjangoでURLを拡張することは可能ですか?もしそうなら、どのように、または同じリクエストパスのオーバーロードをあきらめて、URLに「/new_type/」を追加する必要がありますか(http://mysite.com/new_type/path/) new_type ユーザー?

ありがとう

4

3 に答える 3

2

まず、さまざまなタイプのユーザーがいるとはどういう意味ですか? これを行うための非常に簡単な方法は、ユーザーに属性を保存することです。そうすれば、オブジェクトが与えられたuser場合、この追加の属性を調べて、ユーザーが特別なタイプであるかどうかを判断できます。Django には、このような追加の属性を格納するための標準メカニズムがあり、こちらについて読むことができます。

ユーザーの種類を決定する方法が分かったら、単一のデコレータを作成し、説明した方法で動作する必要があるビューに適用できます。デコレータは、追加の条件や動作を既存の関数に適用する優れた方法です。デコレーターのロジックは、既存の関数の前および/または後に機能するようになるため、ユーザーのタイプに基づいて別のテンプレートを表示するなどのことを非常に簡単に実現できます。

デコレータ関数は、最初に見たときは非常に奇妙に見えますが、注意深く読めばすぐに理解できます。デコレータは関数そのものであり、装飾したい関数をそれに与えます。これは、余分なロジックでラップされた古い関数です。

以下に、テストされていないサンプルコードをいくつか書きました。

def template_based_on_user_type(special_template, ordinary_template):
    def decorator(your_view_function):
        def inner_decorator(request, *args, **kwargs):
            # this is the logic that checks the user type before 
            # every invocation of this view:
            if request.user.type == 'special_type':
                template = special_template
            else:
                template = ordinary_template

            # this is the invocation of the view function, with
            # a custom template selected:
            return your_view_function(request, template)
        return inner_decorator
    return decorator

@template_based_on_user_type('my-special-template.html', 'ordinary-template.html')
def my_view_function(request, template='default.html'):
    # Do what you need to do here
    render_to_response(template, data, RequestContext(request)

デコレータを適用するための構文は、「@」記号の後にデコレータ関数が続きます。デコレーターは、指定されたテンプレート名でカスタマイズされます。

于 2011-07-09T12:08:49.303 に答える
0

いつものようにRTFM :)

可能な解決策へのリンクは次のとおりです: method_splitter @ http://www.djangobook.com/en/2.0/chapter08/

new_type 関連のビューの名前は、index->​​ new_type_index のように、名前の先頭に new_type_ を追加することにより、オリジナルから派生します。

次に、request.user.is_new_type 属性を確認するだけで、返すビューを決定します。醜いですが、無数のビューを変更するよりはましです。

于 2011-07-09T13:08:38.960 に答える