2016-04-30 8 views
0

ダイナミックurls(私は^c/(?P<username>\w+)/^を持っています)からのいくつかの引数をカスタムcontext_processorsに渡すことはできますか?カスタムcontext_processors.pyで引数を渡す方法は?

views.py(私はURLからRequestContextusernameを渡す)

def client_profile(request, username): 
    # .... some context 
    return render_to_response('profile.html', context, 
           context_instance=RequestContext(request, username)) 

context_processors.py

def default_profile(request, username): 
    client = get_object_or_404(Client, user__username=username) 
    #.... some default 
    return { 
     'client': client, 
     #.... some default 
    } 

私はこれを試してみてください、私はページ

をリロードするとき、それは誤りでした

default_profile() missing 1 required positional argument: 'username'

これを行う別の方法はありますか?それとも本当にできないのですか?

- おねがいします。

+0

? Django.contrib.auth UserモデルとのForeignKeyまたはOneToOne関係を持つクライアントモデルをテンプレートコンテキストに取得しようとしているようです。あれは正しいですか? – Del

+0

うん、そうだよ!しかし、クライアントはURLからであり、オンラインクライアントではありません(request.user)。 –

答えて

0

コンテキストプロセッサは非常に単純で、引数は1つだけです。 HttpRequest

リクエストでアクセスできるので、セッションに何かを追加しますが、それがシステム全体またはかなり一般的なものでなければ、ビューを通してコンテキスト変数を提供する方がよい場合があります。たとえば、あなたの例では、URLにユーザー名を入力すると、そのビューの応答にコンテキストを提供しているので、その時点でclientを入力するだけで済みます。

とにかく、セッションを通じて何かを提供した場合、コードは次のようになります。あなたが達成しようとしている何

def client_profile(request, username): 
    # .... some context 
    request.session['username'] = username 
    return render_to_response(
     'profile.html', context, 
     context_instance=RequestContext(request, username) 
    ) 

def default_profile(request): 
    context = {} 
    if 'username' in request.session: 
     username = request.session['username'] 
     client = get_object_or_404(Client, user__username=username) 
     context.update({ 
      'client': client, 
     }) 

    return context 
+0

はい、ありがとうございます。それは仕事です!一番いい方法の一つは、私が今やっていることです。しかし、確かに、それは安全なものですか? –

+0

@ A.Fynn確かに、セキュリティ/プライバシー上の理由からセッションデータに追加したくないものがいくつかあります。しかし、あなたがここでやっていることは安全であるべきだと思っています。同様に、ユーザー名が必要な場合は、そのURL上のユーザーに対してのみ機能するため、コンテキスト・プロセッサーが過度に使用されるため、ビュー・コンテキストに追加することを検討する必要があります。 –

関連する問題