0

djangoで電子メールでパスワードをリセットしています。私はすでにパスワードリセットリンクを含む電子メールを正しく送信しました。問題は、ユーザーが電子メールのパスワードリセットリンクをクリックしたときに、「新しいパスワードを入力してください」の代わりに「メールへのリセットリンクを送信」にリダイレクトされていることです。 。リセット電子メールリンクをパスワードリセット表示にルーティングできません

のURLは以下のとおりです。

url(r'^login/$', views.Login, name='login'), 
url(r'^register/$', views.Register.as_view(), name='register'), 
url(r'^reset_password', views.ResetPasswordRequestView.as_view(), name="password_reset"), 
url(r'^reset_password_confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', views.PasswordResetConfirmView.as_view(), name='reset_password_confirm'), 

ユーザーが自分のメールが(簡潔にするためにテンプレートベースの内部で使用してストライプ化されている)この1での入力に使用するテンプレート:

<form action="" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit"/> 
</form> 

class ResetPasswordRequestView(FormView): 
template_name = 'authentication/password_reset.html' 
success_url = 'login' 
form_class = PasswordResetRequestForm 

def get(self, request, *args, **kwargs): 
    form = PasswordResetRequestForm() 
    return render(request, 'authentication/password_reset.html', {'form': form}) 

def post(self, request, *args, **kwargs): 
    ''' 
    A normal post request which takes input from field "email" (in ResetPasswordRequestForm). 
    ''' 
    form = self.form_class(request.POST) 
    form_email = '' 
    if form.is_valid(): 
     form_email = form.cleaned_data["email"] 
    if self.validate_email_address(form_email): # uses the method written above 
     ''' 
     Verifies that the submited email is valid and gets its asociated user. If it is registered an 
     email will be sent to that address with the reset link 
     ''' 
     user = User.objects.get(email=form_email) 
     if user is not None: 
      email_template_data = { 
       'email': user.email, 
       'domain': request.META['HTTP_HOST'], 
       'site_name': 'Collector', 
       'uid': urlsafe_base64_encode(force_bytes(user.pk)), 
       'user': user, 
       'token': default_token_generator.make_token(user), 
       'protocol': 'http', 
      } 
      email_template_name = 'authentication/password_reset_email.html' 
      subject = 'Password reset on Collector' 
      email = loader.render_to_string(email_template_name, email_template_data) 

      send_mail(subject, email, DEFAULT_FROM_EMAIL, [user.email], fail_silently=False) 
      result = self.form_valid(form) 
      messages.success(request, 
         'An email has been sent to ' + form_email + ". Please check its inbox to continue reseting password.") 
      return result 
     else: 
      result = self.form_invalid(form) 
      messages.error(request, 'No user is associated with this email address') 
      return result 

    messages.error(request, 'Invalid Input') 
    return self.form_invalid(form) 

ビューハンドル:センドパスワードリセットのリンクを扱う

景色

127.0.0.1:8000/authentication/reset_password_confirm/MQ-4gk-262cd9422172a2e21be1/ 

任意のヘルプまたは入力:

は私の問題は、URLがPasswordResetConfirmViewへのユーザーdoesntのルートに送られるということで、このURLは以下の通りです
class PasswordResetConfirmView(FormView): 
""" 
    View that checks the hash in a password reset link and presents a 
    form for entering a new password. 
""" 
template_name = "authentication/password_reset_enter_new.html" 
success_url = 'login' 
form_class = SetPasswordForm 

def get(self, request, uidb64=None, token=None, *arg, **kwargs): 
    form = SetPasswordForm() 
    return render(request, "authentication/password_reset_enter_new.html", {'form': form}) 

def post(self, request, uidb64=None, token=None, *arg, **kwargs): 

    UserModel = User 
    form = self.form_class(request.POST) 
    assert uidb64 is not None and token is not None # checked by URLconf 
    try: 
     uid = urlsafe_base64_decode(uidb64) 
     user = UserModel._default_manager.get(pk=uid) 
    except (TypeError, ValueError, OverflowError, UserModel.DoesNotExist): 
     user = None 

    if user is not None and default_token_generator.check_token(user, token): 
     if form.is_valid(): 
      new_password = form.cleaned_data['new_password'] 
      user.set_password(new_password) 
      user.save() 
      messages.success(request, 'Password has been reset.') 
      return self.form_valid(form) 
     else: 
      messages.error(request, 'Password reset has not been unsuccessful.') 
      return self.form_invalid(form) 
    else: 
     messages.error(request, 'The reset password link is no longer valid.') 
     return self.form_invalid(form) 

:NREパスワードの入力は以下の通りです非常に高く評価されています!

答えて

0

あなたのreset_passwordのURLを終了する必要があります。

url(r'^reset_password/$', ...) 

それ以外の場合は、その文字列で始まるすべてと一致します。

また、Djangoには、この機能のほとんどが既に組み込まれています。

+0

これは機能しました!ありがとうございます! –

関連する問題