我正在制作一个使用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>
答案 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_users
和send_email
方法完成的。
您可以选择将PasswordResetForm
子类化,覆盖get_users
并在子类中调用super().save()
。或者只是复制相关位(删除不需要的内容)并将其添加到表单类中。