「ユースケース」を変更する準備ができているかどうかに応じて、質問に対する回答がいくつかある場合があります。
a)ユース ケースを変更することはできません。1 つの Django セッションが複数のブラウザー ウィンドウ インスタンスまたはタブであるブラウザー セッションにバインドされているため、それは不可能です。
b)ユース ケースを変更できます: ユーザーは、コードを変更することなく、複数のブラウザー (またはプロファイル (または chrome/chromium のプライベート ブラウジング モード)) を使用してこれを実現できます。
c)ウェブサイトに「ユーザー」スイッチ機能を実装して、ユーザーが異なるウィンドウの同じセッションで複数のアクティブなプロファイルを持つことができるようにすることができます。目的は github 組織スイッチ機能または facebook ページ/組織スイッチに似ていますが、 github や facebook の場合とは異なり、複数のタブで複数のユーザーのプロファイルを持つことができます。
c)を達成するには、「SubProfile」モデル インスタンスを「User」モデルにアタッチし、クエリ文字列パラメーターに基づいて受信リクエストごとに適切な SubProfile をアクティブ化し、リクエスト間でサブプロファイル情報を保持する必要があります。
1)Subprofile
への外部キーを持つモデルのようなものを既に持っていると思いますdjango.contrib.auth.models.User
。ユーザーがサブプロファイルを変更できるようにするビューもあるかもしれません。subprofile-switch を機能させるには、サブプロファイルを使用している現在のタブ セッションで情報を永続化する必要があります。そのためには、クエリ文字列にパラメーターを追加する必要があります。これは、ユーザーではなくタブをバインドする唯一の場所であるためです。 -セッション。たとえば、「サブプロファイル = 123」。サブプロファイルをフォームなどで適切に検証する必要があります。ビューは次のようになります。
def select_subprofile(request):
if request.method == 'POST':
form = SubProfileSelectForm(request)
if form.is_valid():
subprofile = form.cleaned_data['subprofile']
url = '%s?subprofile' % (reverse('homepage'), subprofile)
return redirect(url) # the redirect is something like '/homepage?subprofile=123'
else:
form = SubProfileSelectForm()
return render(request, 'myapp/subprofile_select.html', {'form':form})
このビューは、各ゲームの最初のページにすることができます。
2)その後、現在のタブのユーザーのサブプロファイルを取得する必要があります。この件については、ミドルウェアでクエリ文字列を使用します( SO のハウツーと、それが何であるかわからない場合はDjango にバンドルされているミドルウェアの例SubProfile
を探します) を使用して、現在のインスタンスをにアタッチできますrequest.user
。ミドルウェアは、着信要求ごとに、クエリ文字列で見つかった現在のサブプロファイル情報に対応する SubProfile インスタンスを現在のユーザー オブジェクトにアタッチします。ミドルウェアは次のようになります。
class SubProfileMiddleware(object):
def process_request(self, request):
subprofile = request.GET.get('subprofile', None)
if subprofile:
# it's important to check for user here or malicious users will be
# able to use Subprofiles of other users
subprofile = Subprofile.objects.filter(user=request.user, id=subprofile)
# This can also be written
# subprofile = request.user.subprofile_set.filter(id=subprofile)
if not subprofile:
# this is a malicious user
raise Http403
else:
request.user.subprofile = subprofile
else:
# set default subprofile
request.user.subprofile = self.user.default_subprofile
このようにして、アプリのすべてのビューで の属性のSubProfile
インスタンスにアクセスできます。有効なクエリ文字列がある場合、ユーザーはこれらのサブプロファイルをアクティブにします。そうでない場合は、デフォルトのサブプロファイルです。subprofile
request.user
subprofile=123
アプリケーションが、各インスタンスに壁があり、ユーザーがサブプロファイルを使用してメッセージを投稿できるモデルを持つアプリケーションでOrganization
あるとします。壁にメッセージを投稿する関数には次の署名がありpost_on_organization_wall(subprofile, message, organization)
、この関数を使用するビューは次のようになります。
def organization_wall_post(request, organization):
organization = Organization.objects.get_object_or_404(organization)
if request.method == 'POST':
form = MessageForm(request.POST)
if form.is_valid():
post_on_organization_wall(request.user.subprofile, message, organisation)
else:
form = MessageForm()
return render(request, 'organisation/wall_post.html', {'form': form})
3)次に、リクエスト間でサブプロファイル情報を保持する必要があります。これを行う最も簡単な方法は、everycall を{% url %}
独自のurl
テンプレート タグに置き換えて、サブプロファイル キーのリクエスト クエリ文字列の存在を確認し、それをリクエストされた URL に追加することです。Django の url テンプレート タグ のコードを再利用できます。