2016-10-14 2 views
0

私は1つのシナリオを持って前に、マルチレベルのステータスを持っているための最良の方法は何ですか、ユーザ登録があり、それは、複数の状態を持つべきである(is_activeかもしれ - これはデフォルトではboolean型である)Djangoは - ログイン

  1. リストアイテムコード - 0 - >電子メールの確認のために保留
  2. リストアイテムコード - 1 - >活性化/アクティブ(メールが確認された後にのみ管理者がそれを承認する)
  3. リスト項目のコードをアカウント - 2 - >メール確認

私はdjango allauthを使用しています、私はそれを達成するためにブラウズしていましたが、それに近い一致を見つけることができませんでした。あなたの情報のために私はまたProfile OnetoOne model for User model

は、カスタムUserまたはカスタムProfile(私は、それがカスタムProfileとのより良いだと信じていますを作成する必要があります設定

ACCOUNT_CONFIRM_EMAIL_ON_GET = True 
ACCOUNT_EMAIL_VERIFICATION = 'mandatory' 
+0

フィールド 'is_confirmed'を追加できないのはなぜですか? –

+0

@vishes_shellはい、どこに追加すればいいですか、ログインロジックに実装する方法はありますか? – overflow

答えて

1

ファイル

class CustomConfirmEmailView(ConfirmEmailView): 
    def get(self): 
     raise Exception('GET') 
    def post(self,*args,**kwargs): 
     raise Exception('POST') 

を更新しましたdjangoのつぶやきを避けるためUser):

from itertools import compress 

class CustomProfile(Profile): 
    is_confirmed = models.BooleanField(default=False) 

    @property 
    def status(self): 
     return next(compress(['Pending', 'Active', 'Confirmed'], 
          [not self.is_confirmed, not self.is_confirmed and self.user.is_active, self.confirmed and self.user.is_active])) 

私は@propertyを追加して、ユーザーステータスに関するご質問にお答えしています。

is_confirmedを設定する場合は、docsの先を参照する必要があります。allauth.account.views.ConfirmEmailViewにアクセスしてください。

そして、あなたはpostメソッドをオーバーライドする必要があると思います。

class CustomConfirmEmailView(ConfirmEmailView): 
    def post(self, *args, **kwargs): 
     self.object = confirmation = self.get_object() 
     confirmation.confirm(self.request) 
     get_adapter(self.request).add_message(
      self.request, 
      messages.SUCCESS, 
      'account/messages/email_confirmed.txt', 
      {'email': confirmation.email_address.email}) 
     if app_settings.LOGIN_ON_EMAIL_CONFIRMATION: 
      resp = self.login_on_confirm(confirmation) 
      if resp is not None: 
       return resp 
     profile = confirmation.email_address.user.profile 
     profile.is_confirmed = True 
     profile.save() 
     redirect_url = self.get_redirect_url() 
     if not redirect_url: 
      ctx = self.get_context_data() 
      return self.render_to_response(ctx) 
     return redirect(redirect_url) 

次に、そのビューをURLに配置する必要があります。

これだけです。確かに私はそれを実行しませんでした。しかし、論理はここにあります。

+0

ありがとうございます。私は今これをチェックします。あなたが言ったように、私は別の 'Profile'しか持っていませんでした。私は今までauthユーザーで何かを台無しにしていませんでした。 – overflow

+0

もう一つの事は忘れています。私はまた、ログインがis_confirmedかどうかチェックする方法を尋ねました? – overflow

+0

ええ、その 'Profile'を使って、もっと簡単にできます。私が知っているように、あなたがユーザー 'is_active'を使わなければシステムはあなたにログインさせません。 –

0

このようなシナリオでは、decoratorsを使用できます。デコレータは、引数として別のメソッドを受け入れるメソッドです。あなたがしなければならないのは、pass the get/post or any other methods together with its arguments to decoratorです。それから、電子メールの確認/アカウントの有効を確認してください。

from functools import wraps 
from .permissions import is_admin_or_manager 
from .utils import get_user_on_user_identifier 


def is_manager(method): 
    @wraps(method) 
    def wrapper(self, *args, **kwargs): 
     user_identifier = kwargs.get('user_identifier') if kwargs.get('user_identifier') else args[0] 
    user = get_user_on_user_identifier(user_identifier) 
    if user: 
     if is_admin_or_manager(user): 
      return method(self, *args, **kwargs) 
     else: 
      return {'status': 403, 'description': 'Only Manager/Admin roles can create items.'} 
    else: 
     return {'status': 404, 'description': 'No user with given username/email exists.'} 
return wrapper 

class PermissionException(Exception): 
    pass 

そして、あなたの意見では、上記のコード

class Home(View): 
    @is_manager 
    def get(self, request): 
     ... 

はデコレータの使用法に例示しています。あなたの場合は、argsでメソッドを渡します。リクエストargからユーザーをデコレータに渡し、メールが確認されたかどうか/アカウントがアクティブになっているかどうかを確認します。メッセージを返信しない場合は、django messages framework json/stringを使用してメッセージを渡すこともできます。

クラスベースのビューで同じものを使用したい場合は、mixinsと考えてください。メソッドdispatch(self, request, *args, **kwargs)を無効にすることができます。デコレータ/ミックスインの使用は、コードの1行で書いたすべてのビューに対してチェックを行うので、より効果的です。

関連する問題