Django 如何手动发送重置密码电子邮件?
我需要手动发送密码重置电子邮件upen创建一个新用户。我按照描述的步骤创建了一个驱动器,由HttpRequest(Django 如何手动发送重置密码电子邮件?,django,django-authentication,django-csrf,Django,Django Authentication,Django Csrf,我需要手动发送密码重置电子邮件upen创建一个新用户。我按照描述的步骤创建了一个驱动器,由HttpRequest(pwrete\u request=HttpRequest())创建,但调用PasswordResetView所得到的回报是:由于CSRF令牌无效,as\u view()(pwrete\u request)是403 尽管如此(并因此收到了那封电子邮件),页面上没有错误,一切正常 from django.http import HttpResponseForbidden, HttpRes
pwrete\u request=HttpRequest()
)创建,但调用PasswordResetView所得到的回报是:由于CSRF令牌无效,as\u view()(pwrete\u request)
是403
尽管如此(并因此收到了那封电子邮件),页面上没有错误,一切正常
from django.http import HttpResponseForbidden, HttpResponse, HttpRequest
from django.middleware.csrf import get_token
@login_required
@permission_required(["abonnenten.verlag_sachbearbeiter_fullaccess"])
def sachbearbeiter_create_or_edit(request, username=None):
mode = "create" if username is None else "edit"
if mode == "create":
user = None
sachbearbeiter = None
else:
user = get_object_or_404(User, username=username)
sachbearbeiter = user.sachbearbeiter
if user.is_superuser or user.is_staff:
raise PermissionDenied
user_form = UserForm(request.POST or None, instance=user)
sachbearbeiter_form = SachbearbeiterForm(request.POST or None, instance=sachbearbeiter)
if request.method == 'POST':
if mode == "create":
if user_form.is_valid() and sachbearbeiter_form.is_valid():
user = user_form.save(commit=False)
user.email = user.username
user.save()
sachbearbeiter = sachbearbeiter_form.save(commit=False)
sachbearbeiter.user = user
sachbearbeiter.save()
# Manually send password reset mail
# TODO Fix this shit (403)
pwreset_request = HttpRequest()
pwreset_request.method = 'POST'
pwreset_request.META['HTTP_HOST'] = request.META['HTTP_HOST']
pwreset_request.POST = {'email': user.email, 'csrfmiddlewaretoken': get_token(HttpRequest())}
PasswordResetView.as_view()(pwreset_request)
messages.success(request, 'Der Datensatz wurde erfolgreich gespeichert.')
return redirect('sachbearbeiter_edit', username=user.username)
elif mode == "edit":
if user_form.is_valid() and sachbearbeiter_form.is_valid():
user = user_form.save(commit=False)
user.email = user.username
user.save()
sachbearbeiter_form.save()
messages.success(request, 'Der Datensatz wurde erfolgreich gespeichert.')
return redirect('sachbearbeiter_edit', username=user.username)
else:
raise ValueError("Variable `mode` must be 'create' or 'edit'")
return render(request,
'sachbearbeiter/edit_or_create.html',
{'mode': mode,
'user': user,
'user_form': user_form,
'sachbearbeiter_form': sachbearbeiter_form})
有没有办法解决这个问题?为什么要手动创建一个新的
请求
对象,调用密码重置视图,而您只需使用此视图使用的密码重置表单
因此,请替换以下所有代码:
# Manually send password reset mail
# TODO Fix this shit (403)
pwreset_request = HttpRequest()
pwreset_request.method = 'POST'
pwreset_request.META['HTTP_HOST'] = request.META['HTTP_HOST']
pwreset_request.POST = {'email': user.email, 'csrfmiddlewaretoken': get_token(HttpRequest())}
PasswordResetView.as_view()(pwreset_request)
根据该守则:
from django.contrib.auth.forms import PasswordResetForm
reset_password_form = PasswordResetForm(data={'email': user.email})
if reset_password_form.is_valid():
reset_password_form.save(request=request) # The save method will send the email
我认为这对任何人都没有帮助,但给你。哈哈,你需要模板做什么?这与模板无关,我不会再用无用的东西来淹没我的问题。再说一遍,模板或视图没有问题。这是一个只有
pwrete\u request=HttpRequest()
的问题。我已经尝试了get\u token(HttpRequest())
但没有成功。我仍然在reset\u password\u form.save()上出错,因为请求是非类型的。似乎很明显,因为它依赖于为站点名称传递一个请求
实例。解决方法是将请求作为如下参数传递:reset\u password\u form.save(request=request)
。谢谢。很抱歉,我直接在shell\u plus
中测试了上面的代码,所以他可能不需要请求。接受您的编辑。