【问题标题】:How do i send email to user to reset password without explicitly filling PasswordResetForm?如何在不明确填写 PasswordResetForm 的情况下向用户发送电子邮件以重置密码?
【发布时间】:2019-02-15 23:15:03
【问题描述】:

我正在使用 1.11.2 版本制作 Django Web 应用程序,其中管理员使用默认 django 身份验证视图和自定义 html 模板注册用户。我希望当管理员单击“注册”并提交详细信息(如用户名、电子邮件,密码和确认密码)一封电子邮件同时发送到用户的电子邮件 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)

注册.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

登录.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>

【问题讨论】:

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


    【解决方案1】:

    密码重置邮件由django.contrib.auth.forms中的PasswordResetForm类发送。对于您特定版本的 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()。或者只是复制相关位(删除您不需要的东西)并将它们添加到您的表单类中。

    【讨论】:

    • 我的点赞将不会显示,因为我的声誉低于 15,但我真的要感谢 @jaap3。它奏效了。
    • @AmandeepSingh 你能展示你的 PasswordResetForm 子类吗?非常感谢
    • 好的,知道了。就我而言,除了覆盖 get_users() 方法外,我还必须在我的 CustomPasswordResetSerializer 中添加行 password_reset_form_class= CustomResetPasswordForm,而不是在 password_reset url 模式中包含自定义表单作为 kwarg password_reset_form。我希望这可能对某人有用。
    猜你喜欢
    • 2011-02-08
    • 2011-04-16
    • 1970-01-01
    • 2015-03-12
    • 2011-12-29
    • 2014-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多