lakshmen
lakshmen

Reputation: 29064

Resetting Password in Django

I have problem in resetting password in Django . After looking at this:Resetting Password, this error still exist.... My error is:

Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{'uidb36': '1', 'token': '392-804fab6dcec790f0ec6b'}' not found.

Here is my urls.py:

 urlpatterns = patterns('lex.views',
    url(r'^home/forgotpassword', 'lexrequestpassword', name='lexrequestpassword'),
    url(r'^home/resetpassword', 'lexresetpassworddone', name='lexresetpassworddone'),
    url(r'^home/reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'lexresetpasswordconfirmed', name='lexresetpasswordconfirmed'),
    url(r'^home/resetpasswordcompleted', 'lexresetpasswordcompleted', name='lexresetpasswordcompleted'),)

My views.py:

@login_required    
def lexrequestpassword(request):
    """
    Reset Password
    """
    path = reverse('lexresetpassworddone')

    return password_reset(request,post_reset_redirect=path)

@login_required    
def lexresetpassworddone(request):
    """
    Reset Password Done
    """
    path = reverse('lexresetpasswordconfirmed')

    return password_reset_done(request,template_name=path)

@login_required    
def lexresetpasswordconfirmed(request):
    """
    Reset Password Confirmed
    """
    path = reverse('lexresetpasswordcompleted')

    return password_reset_confirm(request,post_reset_redirect=path)

@login_required    
def lexresetpasswordcompleted(request):
    """
    Reset Password Completed
    """
    path = reverse('lexmain')

    return password_reset_complete(request,post_reset_redirect=path) 

Not sure how to solve this. Need some guidance...

Upvotes: 1

Views: 21682

Answers (4)

Piyush Chandra
Piyush Chandra

Reputation: 199

My settings.py:

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = os.environ.get('EMAIL_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_PASS')

My urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/', user_views.register,name='register'),
    path('profile/', user_views.profile,name='profile'),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'),name='login'),
    path('logout/',auth_views.LogoutView.as_view(template_name='users/logout.html'),name='logout'),
    path('password-reset/',auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'),name='password_reset'),
    path('password-reset/done/',auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'),name='password_reset_done'),
    path('password-reset-confirm/<uidb64>/<token>/',auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'),name='password_reset_confirm'),

    path('password-reset-complete/',
         auth_views.PasswordResetCompleteView.as_view(
             template_name='users/password_reset_complete.html'
         ),
         name='password_reset_complete'),
    path('', include('blog.urls')),
]

password_reset.html:

    {% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
           <legend class="border-bottom mb-4">Reset Password</legend>
           {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Request Password Reset</button>
        </div>
     </form>
  </div>
{% endblock content %} 

password_reset_done:

    {% extends "blog/base.html" %}
{% block content %}
    <div class="alert alert-info">
        An email has been sent with instructions to reset your password
    </div>
{% endblock content %} 

password_reset_confirm.html:

    {% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
           <legend class="border-bottom mb-4">Reset Password</legend>
           {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Reset Password</button>
        </div>
     </form>
  </div>
{% endblock content %} 

password_reset_complete.html:

    {% extends "blog/base.html" %}
{% block content %}
    <div class="alert alert-info">
        Your password has been set.
    </div>
    <a href="{% url 'login' %}">Sign In Here</a>
{% endblock content %}

Upvotes: 0

Avinash Garg
Avinash Garg

Reputation: 1402

Password Reset Django has a built-in password reset functions which we are going to use. In this tutorial we will name our app as accounts.

urls.py

from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    admin.autodiscover()

    urlpatterns = patterns('',
        url(
            r'^admin/', 
            include(admin.site.urls)
        ),

        #this is the url for password reset authentication
        #Don't remove, this is important!
        url(
            r'^account/', 
            include('django.contrib.auth.urls')
        ),

        #this is the accounts app main url
        url(
            r'^accounts/', 
            include('accounts.urls', namespace="accounts")
        ),

    )+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

    urlpatterns += staticfiles_urlpatterns()

urls.py

from django.conf.urls import *

urlpatterns = patterns('accounts.views',
   url(
       r'^forgot-password/$', 
       'forgot_password', 
       name="forgot-password"
   ),
)

views.py

from django.contrib.auth.views import password_reset
from django.shortcuts import render

def forgot_password(request):
    if request.method == 'POST':
        return password_reset(request, 
            from_email=request.POST.get('email'))
    else:
        return render(request, 'forgot_password.html')

Put your base.html in your main templates folder

base.html

<html>
<head>
    <title>{% block title %}{% endblock title %}</title>
</head>
<body>
    {% block content %}{% endblock content %}
</body>
</html>

put this template in the app templates folder.

forgot_password.html

{% extends "base.html" %}

{% block title %}Forgot Password{% endblock title %}

{% block content %}
<form method="post" action="{% url django.contrib.auth.views.password_reset %}">
    {% csrf_token %}
    <p>Please enter your email address. 
        You will receive a link to create a new password via email.</p>

    <input type="email" name="email" 
        placeholder="Your e-mail"><br/>

    <button type="submit">Send new password</button>
</form>
{% endblock content %}

settings.py

#add email settings
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'user'
EMAIL_HOST_PASSWORD = 'password'
DEFAULT_FROM_EMAIL = 'your email'

Now we will override the password reset templates of the admin. In your main templates folder create registration folder. Inside the registration folder, create these files:

If you want to change the contents of the files. Make sure it is correct or else you will got an errors.

password_reset_complete.html

{% extends "base.html" %}

{% block title %}Password reset complete{% endblock title %}

{% block content %}
<h4>Reset Complete</h4> 
<p>Your password has been set. 
   You may go ahead and log in now.</p>
<a href="{% url accounts:login %}">Log in</a>
{% endblock content %} 

password_reset_confirm.html

{% extends "base.html" %}

{% block title %}Setting New password{% endblock title %}

{% block content %}
<h4>Set New Password</h4>

<form action="" method="post">
    {% csrf_token %}
    {% if validlink %}
        <p>Please enter your new password twice. 
           So we can verify you typed it in correctly.</p>

        <p>
            {{ form.new_password1.errors }}<br/>
            {{ form.new_password1 }}
        </p>

        <p class="button-height">
            {{ form.new_password2.errors }}<br/>
            {{ form.new_password2 }}
        </p>
    {% else %}
        <h4>Password reset unsuccessful</h4>
        <p>The password reset link was invalid, 
           possibly because it has already been used.
           Please request a new password reset.</p><br/>
    {% endif %}

    <button type="submit">Change my password</button>
</form>
{% endblock content %}

password_reset_done.html

{% extends "base.html" %}

{% block title %}Password reset successful{% endblock title %}

{% block content %}
<h4>Reset Password</h4>
<p>We've e-mailed you instructions for setting 
   your password to the e-mail address you submitted.</p>
<p>You should be receiving it shortly.</p>
<p><a href="{% url accounts:login %}">Login</a></p>
{% endblock content %}  


#password_reset_ email.html
{% load i18n %}
{% load url from future %}
{% autoescape off %}

{% blocktrans %}
You're receiving this e-mail because you requested 
a password reset for your user account at {{ site_name }}.
{% endblocktrans %}

{% trans "Please go to the following page and choose a new password:" %}

{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb36=uid token=token %}
{% endblock %}

{% trans "Your username, in case you've forgotten:" %} {{ user.username }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endautoescape %}

password_reset_form.html

{% extends "base.html" %}

{% block title %}Password reset form{% endblock title %}

{% block content %}
<h4>Reset Password</h4>



    <p>Forgotten your password? 
       Enter your e-mail address below, 
       and we'll e-mail instructions for setting a new one.</p>

    <form action="" method="post">
        {% csrf_token %}
        {% if form.email.errors %}`enter code here`
        <div class="message red-gradient">{{ form.email.errors }}</div><br/>
        {% endif %}

        <p>E-mail address: {{ form.email }} <br/><br/>
    <input type="submit" value="Reset my password"></p>
    </form>

{% endblock content %}

Upvotes: 5

Jordan Reiter
Jordan Reiter

Reputation: 20992

Reverse for 'django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword arguments '{'uidb36': '1', 'token': '392-804fab6dcec790f0ec6b'}' not found.

This means that at some point in the execution, you are not calling reverse on lexresetpasswordconfirmed, you are calling it on django.contrib.auth.views.password_reset_confirm.

Where is this error occurring? In the template? If so, make sure that the template you are using has

{% url lexresetpasswordconfirmed uid token %}

and not

{% url django.contrib.auth.views.password_reset_confirm uid token %}

Is the error occurring in a view? If so, somewhere you are calling reverse on django.contrib.auth.views.password_reset_confirm.

Once that error is resolved, then yes you will have to resolve the other error that Alexander pointed out, namely including the uuid and token in the view function:

@login_required    
def lexresetpasswordconfirmed(request, uuid36, token):
    """
    Reset Password Confirmed
    """
    # you need to do SOMETHING with the uuid and token here, RIGHT?!?!
    path = reverse('lexresetpasswordcompleted')

    return password_reset_confirm(request,post_reset_redirect=path)

So I'm guessing on each of these returns you're using the views from django.contrib.auth, correct? Problem is that one of these views -- probably password_reset_done -- doesn't care that you've provided it with a redirect, it's using its own.

Upvotes: 1

Alexander A.Sosnovskiy
Alexander A.Sosnovskiy

Reputation: 807

Than your def lexresetpasswordconfirmed(request): should accept also uidb36 and token args.

Upvotes: 2

Related Questions