Как использовать встроенный пароль reset/изменить виды с помощью собственных шаблонов
Например, я могу указать url '^/accounts/password/reset/$'
на django.contrib.auth.views.password_reset
с моим именем файла шаблона в контексте, но мне кажется, вам нужно отправить больше деталей контекста.
Мне нужно точно знать, какой контекст добавить для каждого из паролей reset и изменить виды.
Ответы
Ответ 1
Если вы посмотрите на источники django.contrib.auth.views.password_reset, вы увидите, что он использует RequestContext
. В результате вы можете использовать Context Processors для изменения контекста, который может позволить вам вводить необходимую вам информацию.
В b-списке есть хорошее представление для контекстных процессоров.
Изменить (я, кажется, был смущен тем, что было на самом деле):
Вы заметите, что password_reset
принимает именованный параметр с именем template_name
:
def password_reset(request, is_admin_site=False,
template_name='registration/password_reset_form.html',
email_template_name='registration/password_reset_email.html',
password_reset_form=PasswordResetForm,
token_generator=default_token_generator,
post_reset_redirect=None):
Подробнее о password_reset.
... таким образом, с urls.py вроде:
from django.conf.urls.defaults import *
from django.contrib.auth.views import password_reset
urlpatterns = patterns('',
(r'^/accounts/password/reset/$', password_reset, {'template_name': 'my_templates/password_reset.html'}),
...
)
django.contrib.auth.views.password_reset
будет вызываться для URL-адресов, соответствующих '/accounts/password/reset'
, с аргументом ключевого слова template_name = 'my_templates/password_reset.html'
.
В противном случае вам не нужно предоставлять какой-либо контекст, поскольку представление password_reset
заботится о себе. Если вы хотите узнать, какой контекст у вас есть, вы можете вызвать ошибку TemplateSyntax
и просмотреть трассировку стека, чтобы найти кадр с локальной переменной с именем context
. Если вы хотите изменить контекст, то то, что я сказал выше о обработчиках контекстов, возможно, это путь.
Вкратце: что вам нужно сделать, чтобы использовать свой собственный шаблон? Предоставьте аргумент ключевого слова template_name
для представления при его вызове. Вы можете поставить аргументы ключевого слова в представления, включив словарь в качестве третьего члена кортежа шаблонов URL.
Ответ 2
Настоятельно рекомендую эту статью.
Я просто подключил его и работал
http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html
Ответ 3
Вам просто нужно обернуть существующие функции и передать в нужном вам шаблоне. Например:
from django.contrib.auth.views import password_reset
def my_password_reset(request, template_name='path/to/my/template'):
return password_reset(request, template_name)
Чтобы увидеть это, просто взгляните на функцию declartion встроенных представлений:
http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74
Ответ 4
Вы можете сделать следующее:
- добавить к своим URL-адресам (r '^/accounts/password/ reset/$', password_reset)
- поместите свой шаблон в '/templates/registration/password_reset_form.html'
- сделайте свое приложение перед "django.contrib.auth" в INSTALLED_APPS
Пояснение:
Когда шаблоны загружаются, они выполняются в вашей переменной INSTALLED_APPS в settings.py.
Порядок продиктован рангом определения в INSTALLED_APPS, так как ваше приложение появилось до "django.contrib.auth", ваш шаблон был загружен (ссылка: https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader).
Мотивация подхода:
- Я хочу быть более сухим и не повторяться для любого представления (определенного django) имени шаблона (они уже определены в django)
- Мне нужен самый маленький url.py
Ответ 5
документация говорит, что существует только одна контекстная переменная form
.
Если у вас возникли проблемы с логином (что является общим), документация говорит, что существуют три контекстные переменные:
-
form
: объект формы, представляющий форму входа. Подробнее о формах см. В документации по формам.
-
next
: URL-адрес для перенаправления после успешного входа в систему. Это может также содержать строку запроса.
-
site_name
: имя текущего сайта, в соответствии с настройкой SITE_ID.
Ответ 6
Я использовал эти две строки в URL-адресе и шаблоне администратора, что я менял в своей потребности
url(r'^change-password/$', 'django.contrib.auth.views.password_change', {
'template_name': 'password_change_form.html'}, name="password-change"),
url(r'^change-password-done/$', 'django.contrib.auth.views.password_change_done', {
'template_name': 'password_change_done.html'
}, name="password-change-done")
Ответ 7
Другим, возможно, более простым решением является добавление вашего каталога шаблонов переопределения в запись DIRS параметра TEMPLATES в settings.py. (Я думаю, что этот параметр является новым в Django 1.8. Его можно было назвать TEMPLATE_DIRS в предыдущих версиях Django.)
Так же:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# allow overriding templates from other installed apps
'DIRS': ['my_app/templates'],
'APP_DIRS': True,
}]
Затем поместите свои файлы шаблонов переопределения в my_app/templates
. Таким образом, шаблон переопределенного пароля reset будет my_app/templates/registration/password_reset_form.html