如何在不显式填写PasswordResetForm的情况下向用户发送电子邮件以重置密码?

时间:2018-09-11 12:35:58

标签: django django-views django-authentication django-registration

我正在制作一个使用1.11.2版本的Django Web应用程序,其中管理员正在使用默认的django身份验证视图和自定义的html模板注册用户。我希望当管理员单击``注册''并提交详细信息时(例如用户名,电子邮件,密码和确认密码)同时将一封电子邮件发送到用户的email-id,其中有一个重置密码的链接,以便用户可以重置他/她的密码。除非我同意,否则我不想显式使用password_reset_view和password_reset_done视图使用“忘记密码”选项。

这是我编写的代码。

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 个答案:

答案 0 :(得分:1)

密码重设邮件由PasswordResetForm中的django.contrib.auth.forms类发送。对于您特定版本的Django,可以在以下位置找到代码:https://github.com/django/django/blob/1.11.2/django/contrib/auth/forms.py#L225

大部分工作是通过save方法完成的,而一小部分是通过get_userssend_email方法完成的。

您可以选择将PasswordResetForm子类化,覆盖get_users并在子类中调用super().save()。或者只是复制相关位(删除不需要的内容)并将其添加到表单类中。