0
votes

I am making a Django web app using 1.11.2 version in which admin is registering users using default django authentication views and customized html templates.I want that when admin clicks on 'Register' and submits the details (like username,email,password and confirmed password) an email is simultaneously sent to user's email-id in which there is a link to reset password so that user can reset his/her password.I don't want to explicitly use password_reset_view and password_reset_done view unless i am using forgot password option.

Here what i have coded.

views.py

 from django.contrib.auth import get_user_model
 from django.contrib.auth.mixins import LoginRequiredMixin
 from django.contrib.auth.models import Permission, User
 from django.contrib.auth.views import RegisterView

 class RegisterView(SuccessMessageMixin, CreateView):
   form_class = RegisterForm
   template_name = 'registration/register.html'
   success_message = "Your account was created successfully."

   def dispatch(self, *args, **kwargs):
     return super(RegisterView, self).dispatch(*args, **kwargs)

register.html

{% extends "base.html" %}
{% block nav_people %}
class="active"
{% endblock %}
{% block content %}
{% load static %}
<!DOCTYPE html>
<html lang=en>
<head>
  <link rel="stylesheet" href="{% static "dashboard/css/login.css" %}"/>
 </head>
    <body>
     <title>Register</title>
      <div class="reg">
      <div class="regbox">

        <h1>Register</h1>
        <br>

     <form class='text-left' method="post" action="{% url 'register' %}">
      {% csrf_token %}
      {{ form.as_p }}

     <input type="submit" value="Register" />
     <input type="hidden" name="next" value="{{ next }}" />
    </form>

    </div>
   </div>
   </body>
  </html>
  {% endblock %}

forms.py

class RegisterForm(forms.ModelForm):
  """A form for creating new users. Includes all the required
  fields, plus a repeated password."""
  password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
  password2 = forms.CharField(label='Password confirmation', 
  widget=forms.PasswordInput)

  class Meta:
    model = User
    fields = ('username', 'email',)

  def clean_email(self):
    email = self.cleaned_data.get("email")
    qs = User.objects.filter(email__iexact=email)
    if qs.exists():
        raise forms.ValidationError("Cannot use this email. It's already 
        registered")
    return email

   def clean_password2(self):
    # Check that the two password entries match
     password1 = self.cleaned_data.get("password1")
     password2 = self.cleaned_data.get("password2")
     if password1 and password2 and password1 != password2:
        raise forms.ValidationError("Passwords don't match")
    return password2

   def save(self, commit=True):
    # Save the provided password in hashed format
     user = super(RegisterForm, self).save(commit=False)
     user.set_password(self.cleaned_data["password1"])
     #user.password = "asdfasd"
     user.is_active = True


      if commit:
        user.save()
        # user.profile.send_activation_email()
        # create a new user hash for activating email.
       return user

login.html

{% load static %}
 <!DOCTYPE html>
<html lang=en>
<head>

<title>Login</title>
<link rel="stylesheet" href="{% static "dashboard/css/login.css" %}"/>
</head>
<body>
<div class="login">
<div class="loginbox">
{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

{% if next %}
{% if user.is_authenticated %}
<p> To proceed,
please login with an account that has access.</p>
{% else %}


    {% if not form.errors %}
    <p>Please login to see this page.</p>
    {% endif %}

 {% endif %}
 {% endif %}

 <form method="post" action="{% url 'login' %}">
 {% csrf_token %}

 <label>USER NAME </label>{{ form.username }}<br>
 <label>PASSWORD </label>{{ form.password }}<br>
<input type="submit" value="Login" />
 <input type="hidden" name="next" value="{{ next }}" />
 </form>  
 <a href='{% url "reset_password" %}' class="btn">Forgot Password</a>
</div>
</div>
</body>
</html>
1

1 Answers

2
votes

The password reset mail is sent by the PasswordResetForm class in django.contrib.auth.forms. For your specific version of Django the code can be found here: https://github.com/django/django/blob/1.11.2/django/contrib/auth/forms.py#L225

Most of the work is done in the save method, and a small portion is done in the get_users and send_email method.

You can choose to either subclass the PasswordResetForm, override get_users and call super().save() in your subclass. Or just copy over the relevant bits (removing stuff you don't need) and add them to your form class.