2017-11-20 3 views
1

私は実際にdjangoプロジェクトに取り組んでいます。私はCustomUserモデルに移行しています。データベース上のすべてがうまくいって、今私は自分の情報を更新するようにしたい(新しいモデルを尊重する)Django - ログイン時にユーザを更新

私はログインするときにそれをしたいと思います。 @ mysite.tmpが既に更新されているかどうかを知るため)。したがって、電子メールがこれで終了した場合、更新されたユーザービュー(ログされずに)に自動的にリダイレクトされ、フォームを送信するときにログインします(フォームが有効な場合)。

私の質問は、これをログイン時に行う方法です。私はログイン機能をオーバーライドすることができますが、それはより良い選択肢ではないようです。私はオーバーライドできるビューがありますか?あなたは私に何を勧めますか?

EDIT:あなたの応答で私は最終的にlogged_inシグナルを無効にして、loggin_requiredデコレータにチェックを入れて、ユーザーが最新のものかどうかを確認しました。今私の問題は、私は信号が何であるか、それをどのように上書きするのかを理解していないということです。私が上書きしなければならないUserモデルのメソッドですか?この場合、それは非常に簡単ですか、それとも別の場所ですか? 私に説明したり、このテーマに関するわかりやすいドキュメントにリンクしたりできますか?

PS:私は彼が彼のプロフィールを更新する前に、ユーザーがログインが全然したくないので、私はあなたが建てのサブクラスを作成する必要があるだろうと思いジャンゴ1.11とPython 3.6

+1

「user_logged_in」信号​​を使用することをお勧めします。ここにドキュメントがあります:https://docs.djangoproject.com/en/1.11/ref/contrib/auth/#django.contrib.auth.signals.user_logged_in – cmertayak

+0

私は彼のプロフィールを更新する前にユーザーにログインしない方がいいです。そのような彼はサイトの登録された部分にアクセスすることができないように。 – Myhrael

答えて

0

私は少し進歩しましたが、まだ問題があります。必要に応じて私はリダイレクトを作る方法がわからないとき

def login_test(sender, user, request, **kwargs): 
    if(user.email.endswith('@mysite.tmp')): 
    print('logged in with old user') 
    #and now redirect to my view 
user_logged_in.connect(login_test) 

My機能の仕事だけでなく、メッセージがコンソールに印刷します:ここで私は、ログイン信号を得たとき、私の行動です。私はリダイレクトとレンダリングを試みましたが、何もしません。ユーザーが正常にログインすると、標準のリダイレクトリンクにリダイレクトされます。

EDIT:ウェブ上を見た後、信号内でリダイレクションを行うことができないことがわかりました。詳細については、この投稿:Django signals redirectをご覧ください。完全に罰金このITの仕事で

class LoginView(BasicLoginView): 
    def get_success_url(self): 
    if self.resquest.user.email.endswith('@mysite.tmp'): 
     return resolve_url('edit-profile') 
    else: 
     return super().get_success_url() 

: は、したがって、私はジャンゴの1を拡張するカスタムログインビューを書きます!

もう一度お返事いただきありがとうございました

0

で働いています-inログインビューとそれにform_validメソッドオーバーライドします:私はこの方法で問題の種類を確認

# urls.py 
from .views import CustomLoginView 

urlpatterns = [ 
    url(r'^auth/login', CustomLoginView.as_view(), name='login') 
] 

# views.py 
from django.contrib.auth.views import LoginView 

class CustomLoginView(LoginView): 
    """Custom login view to force the users to update themselves before login""" 

    def form_valid(self, form): 
      """Check if we should allow the user to login""" 

      user = form.get_user() 

      # Here you can check if the user is an old one or not 
      if '@mysite.tmp' in user.email: 
       # The user should be updated, redirect to the update view 
       return HttpResponseRedirect(reverse('update-view')) 
      else: 
       # The user is already updated, call the base `form_valid` 
       return super().form_valid(form) 

そして、あなたのURLでこのビューを使用します。ログインしているユーザーを必要としないユーザーの更新ビューを作成する必要があります。

+0

私は最終的にはログインした信号を使用しますが、私はログインビューのユーザーを必要としないように更新ビューを表示させたくありません。しかし、私はいくつかの問題を抱えて、私は本当にこのlogged_inメソッドが何であるか分かりません。私はそれがシグナルだが、このコンセプトを理解していないし、それを実装する方法を知らない。 – Myhrael

関連する問題