2017-12-15 18 views
4

私はdjangoプロジェクトに取り組んでいます。認証用にデフォルトの認証アプリケーションを使用しています。
ユーザーの最後のログイン時刻を格納するユーザーモデルには、last_loginフィールドがあることは知っています。adminパネルでDjangoスタッフの初回ログインを確認するには?

初めて管理者パネルにログインするとき、last_loginフィールドが「なし」の場合は、&をパスワード変更ページにリダイレクトします。

この小切手はどこに置く必要がありますか?

私がこれまで試してみました何


は、私は、カスタムログインフォームを使用して、その上にデフォルトconfirm_login_allowedメソッドをオーバーライドすることを試みたが、私は唯一のブロックに検証エラーを上げることができるように思えますこれらを使用してログインを試みます。

私もdjango.contrib.auth.signals.user_logged_inシグナルを使ってみましたが、last_loginNoneのときにリダイレクト応答を返すこともできません。

ユーザーが認証された後にリダイレクト応答を返す方法を知りたい。

+0

downvoteの理由 – Mohan

答えて

3

Django管理者は設定できません。その内部ビューにフックする必要があります。ログイン/ログアウトビューは、Django AdminSiteクラス(通常はadmin.siteでアクセスするもの)内にあります。私の実装は少しハックが、小さいです:あなたはクリーンなソリューションをしたい場合は、私がlast_loginに頼るのではなく、ユーザーモデル内のブール値を使用することをお勧め

貼り付けurls.py

from django.contrib import admin 
from django.contrib.admin import AdminSite 
from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 
from django.http import HttpResponseRedirect 

class MyAdminSite(AdminSite): 
    def login(self, request, extra_context=None): 
     new_user = False 
     user = None 

     username = request.POST.get('username') # Hack to find user before its last_login set to now. 
     if username: 
      user = User.objects.filter(username=username).first() 
      if user: 
       new_user = user.last_login is None 

     r = super(MyAdminSite, self).login(request, extra_context) 

     if new_user and request.user == user and isinstance(r, HttpResponseRedirect): # Successful logins will result in a redirect. 
      return HttpResponseRedirect(reverse('admin:password_change')) 
     return r 

admin.site = MyAdminSite() 

の上部にあるので、あなただけの可能性request.POSTに私のハックの代わりにrequest.userをチェックしてください。

AdminSite.logindjango.contrib.auth.views.loginを読むと、実際にDjango内で何が起こっているのかを確認できます。

3

AdminSiteを使用してDjango管理者をカスタマイズし、login_form属性を使用してAdminログインページのカスタムログインフォームを指定します。

admin.py

class MyAdminSite(AdminSite): 
    login_form = CustomAdminLoginForm 

admin_site = MyAdminSite(name='myadmin') 
admin_site.register(User) 
admin_site.register(Group 

urls.py

Djangoのデフォルトの管理を取り除くために我々が持っている管理者をオーバーライド

from app.admin import admin_site 

url(r'^admin/', admin_site.urls) 

forms.py

AuthenticationForm持っていますconfirm_login_allowedメソッドは、これを使用してloに許可を与えますログインしているかどうかを確認してください。

class CustomAdminLoginForm(AuthenticationForm): 
    def confirm_login_allowed(self, user): 
     if user.last_login: 
      raise ValidationError(mark_safe('Hey first time user please reset your password here... <a href="/test">test</a>'), code='inactive') 

注:このアプローチでは、考慮すべき点はたくさんあります。

  1. ユーザーが最初にパスワードを設定しなかった場合、どのように2回目の試行を処理するのですか?今回はlast_longがNoneではありません。 date_joinedが救助になります。 last_login == date_joined
  2. しかし、ユーザーが最初の日にパスワードを設定しておらず、翌日になるとどうなりますか?

編集:

あなたはログインしているユーザーをチェックし、ここにconfig_login_allowedロジックを適用するために信号を使用することができますか...?

from django.contrib.auth.signals import user_logged_in 


def change_password_first_time(sender, user, request, **kwargs): 
    # Your business logic here... 

user_logged_in.connect(change_password_first_time) 
+0

'confirm_login_allowed'はログインユーザーをブロックする必要がある場合に役立ちますが、私はそれを望んでいません。ユーザーがログインしてパスワード変更ページに移動したいと思っています。 – Mohan

+1

ああ、私はあなたが 'user_logged_in'シグナルを使うことができるかもしれません...私は自分のanwerを更新しました –

+0

これはうまくいくかもしれませんが、私のudpateパスワードがモデル管理方法であれば、メソッドの接続機能? 私はそのメソッドを呼び出すために、モデルadminのインスタンスが必要になります。 'def user_change_password(self、request、id、form_url = ''): ' – Mohan

関連する問題