Python 发送自定义密码重置表单
我想通过访问某个url并通过POST方法传递电子邮件来重置django应用程序中的密码。这是因为我想在android应用程序中使用它,它将有自己的形式。所以,我想我可以创建一个自定义密码重置表单,然后保存它,但它不起作用Python 发送自定义密码重置表单,python,django,Python,Django,我想通过访问某个url并通过POST方法传递电子邮件来重置django应用程序中的密码。这是因为我想在android应用程序中使用它,它将有自己的形式。所以,我想我可以创建一个自定义密码重置表单,然后保存它,但它不起作用 from django.contrib.auth.forms import PasswordResetForm class Custom_password_reset_form(PasswordResetForm): def __init__(self, email,
from django.contrib.auth.forms import PasswordResetForm
class Custom_password_reset_form(PasswordResetForm):
def __init__(self, email, **kwargs):
super(Custom_password_reset_form, self).__init__(**kwargs)
self.email = forms.EmailField(initial=email, max_length=254)
def mobile_password_reset(request):
"""Sends mail with password reset link."""
email = request.POST.get('email')
my_form = Custom_password_reset_form(email)
if my_form.is_valid():
print 'valid'
my_form.save()
else:
print 'not valid'
print my_form._errors
return render(...)
验证总是失败,给出空的<代码>我的表单。\错误代码>列表。我错过了什么?或者也许有更好的方法
正确的代码:
自定义类是不必要的,应该删除。密码重置方法应如下所示:
def mobile_password_reset(request):
"""Sends mail with password reset link."""
my_form = PasswordResetForm(request.POST)
if my_form.is_valid():
my_form.save()
return JsonResponse({'success': True})
else:
return JsonResponse({'success': False})
需要注意的是,如果未将django.contrib.sites
app添加到设置中,my_form.save()
将无法工作。也可以通过添加以下参数来修复此问题:my\u form.save(request=request)
表单。您正在传递电子邮件参数,但没有数据
,因此表单将始终处于未绑定状态。对于未绑定表单,是有效的()
返回False
,但没有错误
我不明白你的定制表格需要什么。如果电子邮件
在request.POST
中,为什么不将request.POST
传递到常规的PasswordRestForm
my_form = PasswordResetForm(request.POST)
可以通过重写django的auth模块来实现这一点。 在URL.py中添加以下URL
url(r'^password_reset/$', PasswordReset.as_view(is_admin_site=True),
{'is_admin_site': 'True'}),
在此之后,添加以下视图
class PasswordReset(RedirectView):
is_admin_site = False
template_name = 'forget_password.html'
email_template_name = 'password_reset_email.html'
subject_template_name = 'password_reset_subject.html'
token_generator = default_token_generator
post_reset_redirect = None
from_email = None,
current_app = None,
extra_context = None
def get(self, request, *args, **kwargs):
form = YourCustomPasswordResetForm()
context = {
'form': form,
}
if self.extra_context is not None:
context.update(self.extra_context)
return TemplateResponse(request, self.template_name, context,
current_app=self.current_app)
def post(self, request, *args, **kwargs):
form = YourCustomPasswordResetForm(request.POST)
if form.is_valid():
if self.from_email is not None:
from_email = 'From Email'
opts = {
'use_https': request.is_secure(),
'token_generator': self.token_generator,
'from_email': self.from_email,
'email_template_name': self.email_template_name,
'subject_template_name': self.subject_template_name,
'request': request,
}
if self.is_admin_site:
opts = dict(opts, domain_override=request.get_host())
form.save(**opts)
return HttpResponseRedirect(self.post_reset_redirect)
context = {
'form': form,
}
if self.extra_context is not None:
context.update(self.extra_context)
return TemplateResponse(request, self.template_name, context,
current_app=self.current_app)
在窗体中,添加窗体并在其中添加以下保存方法
def save(self, domain_override=None,
subject_template_name='registration/password_reset_subject.txt',
email_template_name='registration/password_reset_email.html',
use_https=False, token_generator=default_token_generator,
from_email=None, request=None):
"""
Generates a one-use only link for resetting password and sends to the
user.
"""
from_email = 'From Email'
from django.core.mail import send_mail
user = User.objects.get(username=request.POST['username'])
if not domain_override:
current_site = get_current_site(request)
site_name = current_site.name
domain = current_site.domain
else:
site_name = domain = domain_override
c = {
'email': user.email,
'domain': domain,
'site_name': site_name,
'uid': int_to_base36(user.id),
'user': user,
'token': token_generator.make_token(user),
'protocol': use_https and 'https' or 'http',
}
subject = loader.render_to_string(subject_template_name, c)
# Email subject *must not* contain newlines
subject = ''.join(subject.splitlines())
email = loader.render_to_string(email_template_name, c)
send_mail(subject, email, from_email, [user.email])
当您提交该表单时,用户将收到包含令牌的链接的电子邮件。该链接只能使用一次 我还没有测试你的答案,但对我的问题来说似乎太重了。