8

私は自分のプロジェクトに内部アカウントのプライバシー許可を持っています (たとえば、友人だけがユーザーのプロフィール ページを見ることができます)。この場合、カスタム許可拒否ページを作成したいと考えています。ステータス コードが 403 の TemplateView から応答を返す方法はありますか?

このようなもの:

class PrivacyDeniedView(TempateView):
    template_name = '...'
    status_code = 403

dispatch() をオーバーライドすることでこれを行うことができますが、おそらく Django にはすぐに使用できるソリューションがあります

回答: 一般的な解決策はないようです。最良の方法は@alecxeによって提案されていますが、@FoxMaSkが提案したようにMixinにカプセル化されています

4

5 に答える 5

11

1 つのオプションは、クラスのget()メソッドをオーバーライドすることです。TemplateView

def get(self, request, *args, **kwargs):
    context = self.get_context_data(**kwargs)
    return self.render_to_response(context, status=403)
于 2013-09-11T12:56:40.220 に答える
3

alecxeの答えは機能しますが、オーバーライドを避けることを強くお勧めしますget; CBV が のような他のメソッドを持つことができることを忘れがちpostです。1 つをオーバーライドする場合は、他のメソッドに対しても同じことを行う必要があります。

実際、403 エラーを表示するためだけに別のビューを作成する必要はありません。Django には既にdjango.http.HttpResponseForbidden. したがって、ビューにリダイレクトする代わりに、次の行に沿って何かを行うだけです。

if not user.has_permission(): # or however you check the permission
    return HttpResponseForbidden()

または、特定のテンプレートをレンダリングする場合:

if not user.has_permission(): # or however you check the permission
    return HttpResponseForbidden(loader.render_to_string("403.html"))
于 2013-09-11T22:52:36.590 に答える
2

私もこの問題に遭遇しました。私の目標は、urls.py でステータス コードを指定できるようにすることでした。

url(r'^login/error/?$', TemplateView.as_view(template_name='auth/login_error.html', status=503), name='login_error'),

したがって、このスレッドの以前の回答をアイデアのスターターとして使用して、次の解決策を思いつきました。

class TemplateView(django.views.generic.TemplateView):

    status = 200

    def render_to_response(self, context, **response_kwargs):

        response_kwargs['status'] = self.status

        return super(TemplateView, self).render_to_response(context, **response_kwargs)
于 2014-02-24T13:20:15.453 に答える
1

これは古い質問ですが、検索時に最初に出くわしました。私は別の一般的なビュー ( ListView) を使用していましたが、その実装getはもう少し複雑であるため、オーバーライドするのは少し面倒です。私は代わりにこの解決策に行きました:

def get(self, request, *args, **kwargs):
    response = super(ListView, self).get(request, *args, **kwargs)
    response.status_code = 403
    return response

これにより、リクエストのいくつかのパラメーターに基づいてステータス コードを決定することもできました。これは、私の場合、古いスタイルの URL パターンに対して 301 リダイレクトを実行するために必要でした。

メソッド内からステータス コードを変更する機能が必要ない場合は、cjerdonek の回答が理想的です。

于 2016-12-02T00:48:39.327 に答える