2017-12-14 13 views
0

Django Genericビュー、DetailViewを使用しています。 しかし、まだ電子メール未確認の詳細投稿にユーザーがアクセスするのをブロックしたいと思います。 ユーザーモデルにemail_confirmedフィールドがあります。Djangoに条件を追加したいDetailView

私のコードは次のとおりです。

@method_decorator(login_required(login_url='/login/'), name='dispatch') 
class RecruitView(generic.DetailView): 
    model = Recruit 
    template_name = 'recruit.html' 

と私は追加したい:

if not request.user.email_confirmed: 
     error_message = "you did not confirmed yet. please check your email." 
     return render(request, 'info.html', {'error_message': error_message}) 
    else: pass 

がどのように私はDetailViewにこの条件を追加することができますか?

(私は「as_view」を上書きしようとしたが、私はそれを行う方法がわからない)

答えて

2

私はPermissionRequiredMixinを使用します。これにより、ユーザーが必要とする特定のアクセス権を指定するか、has_permissionメソッドを上書きすることができます。

from django.contrib.auth.mixins import PermissionRequiredMixin 

class RecruitView(PermissionRequiredMixin, generic.DetailView): 
    ... 

    login_url = '/login/' 
    permission_denied_message = 'you did not confirmed yet. please check your email.' 

    def has_permission(self): 
     return self.request.user.email_confirmed 

これは、エラーメッセージを表示することができlogin_urlemail_confirmedせずにユーザーをリダイレクトします。代わりにindex.htmlテンプレートを使用するには、handle_no_permissionメソッドをオーバーライドする必要があります。

+1

権限をチェックしていないので、['UserPassesTestMixin'](https://docs.djangoproject.com/en/2.0/topics/auth/default/#django.contrib.auth .mixins.UserPassesTestMixin)、 'test_func'をオーバーライドします。 – Alasdair

+0

うわー!それは私の最初の質問でした、そして私は非常に印象的です!そんなにありがとう、私を救った:) –

関連する問題