Отображение формы 'None' в производстве
Когда я использую сброс пароля в разработке, он работает нормально. Однако в продакшене после того, как пользователь открывает письмо сброса, форма сброса пароля не отображается, однако другие формы на сайте через crispy forms работают нормально. Ничего не было изменено в dev и production, кроме url в представлении. На сервере и в dev установлена одна и та же версия crispy forms.
Я сделал это, основываясь на этом учебнике и, кажется, я сделал все необходимые изменения для производства
При проверке адресов электронной почты между production и dev я не вижу проблемы
http://127.0.0.1:8000/reset/MQ/***hm*-e00d**b30b635b358be1573e********/
https://domain.co/reset/MQ/***ht*-71ff80c**580c6cecc3ffd44********/
Обновление:
Если я пытаюсь отобразить форму как {{ form }}, она отображается только None, что наводит меня на мысль, что контекст не передается и это не проблема crispy
view:
def password_reset_request(request):
if request.method == "POST":
password_reset_form = PasswordResetForm(request.POST)
if password_reset_form.is_valid():
data = password_reset_form.cleaned_data['email']
associated_users = User.objects.filter(Q(email=data)|Q(username=data))
if associated_users.exists():
for user in associated_users:
subject = "Password Reset Requested"
plaintext = template.loader.get_template('users/password_reset_email.txt')
htmltemp = template.loader.get_template('users/password_reset_email.html')
c = {
"email":user.email,
'domain':'domain.com',
'site_name': 'Website',
"uid": urlsafe_base64_encode(force_bytes(user.pk)),
"user": user,
'token': default_token_generator.make_token(user),
'protocol': 'https',
}
text_content = plaintext.render(c)
html_content = htmltemp.render(c)
try:
msg = EmailMultiAlternatives(subject, text_content, 'myemail@email.com', [user.email], headers = {'Reply-To': 'myemail@email.com'})
msg.attach_alternative(html_content, "text/html")
msg.send()
except BadHeaderError:
return HttpResponse('Invalid header found.')
return redirect ("password_reset_done")
password_reset_form = PasswordResetForm()
return render(request=request, template_name="users/password_reset.html", context={"password_reset_form":password_reset_form})
Шаблон:
{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="loginout-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">Reset Password</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="login-register-btn" type="submit">Reset</button>
</div>
</form>
</div>
{% endblock content %}
Урлы:
from users import views as user_views
path("reset_password/", user_views.password_reset_request, name="password_reset"),
path('reset_password_sent/', auth_views.PasswordResetDoneView.as_view(template_name="users/password_reset_sent.html"), name="password_reset_done"),
path('reset/<uidb64>/<token>/',auth_views.PasswordResetConfirmView.as_view(template_name="users/password_reset_form.html"), name="password_reset_confirm"),
path('reset_password_complete/', auth_views.PasswordResetCompleteView.as_view(template_name="users/password_reset_done.html"), name="password_reset_complete"),