Як я можу використовувати вбудовані в пароль скидання / зміну поглядів із власними шаблонами


92

Наприклад , я можу вказати url '^/accounts/password/reset/$'на django.contrib.auth.views.password_resetз моїм шаблоном файлом в контексті , але я думаю , що потрібно послати більше інформації контексту.

Мені потрібно точно знати, який контекст потрібно додати для кожного скидання пароля та зміни поглядів.


1
З огляду на назву цього питання, я не думаю, що contextце правильна річ, яку ви шукаєте!
jb.

2
Тільки для підтвердження під "контекстом" я мав на увазі словник додаткових даних, що є третім аргументом у рядку URL. також додаткові дані або kwargs . Вибачте за плутанину, відредагуйте це питання будь-хто, хто зможе.
Tom Viner

Відповіді:


100

Якщо ви подивитеся на джерела для django.contrib.auth.views.password_reset, ви побачите, що воно використовується RequestContext. Підсумок полягає в тому, що ви можете використовувати контекстні процесори, щоб змінити контекст, який може дозволяти вводити потрібну вам інформацію.

Список 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):

Перевірте reset_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.


Я вважаю, що питання полягає у використанні різних шаблонів із вбудованими поданнями - процесори контексту не враховують це!
jb.

6
будь-яка ідея, як дати на registration/password_reset_email.htmlнасправді містять HTML елементи , такі як: <div>, <a>тому що це посилає тільки текст
mabdrabo

@mabdrabo - ознайомтеся з цією статтею про те, як налагодити роботу HTML.
грегольцов

26

Настійно рекомендую цю статтю.

Я просто підключив його і воно спрацювало

http://garmoncheg.blogspot.com.au/2012/07/django-resetting-passwords-with.html


2
чудове посилання, спасибі для тих, хто переходить за посиланням - django-реєстрація тепер включає перегляди аутентифікації за замовчуванням ... тому все, що вам потрібно зробити, - це створити шаблони, детально описані вище. також - використовуйте django-crispy-form, якщо ви хочете уникнути всі роботи в ручному форматі html, які він також робив.
dougvk

Є деякий застарілий код Django, яким я маю керувати на роботі, але я майже нічого не знаю про рамки. Той хлопець врятував мені попу! Чудовий підручник
Мет Вукас

Дякуємо за посилання! Я думаю, що це має бути прийнятою відповіддю, оскільки, як ти сказав, підключив її і вона спрацювала.
ihatecache

10

Вам просто потрібно обгорнути існуючі функції і передати потрібний шаблон. Наприклад:

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)

Щоб побачити це, просто подивіться на декларацію функції вбудованих представлень:

http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/views.py#L74


2
Не найпростіший спосіб зробити це. Ви можете передати у словник як третю частину шаблонів URL-адрес, або, якщо вам здається, що ви дійсно повинні завершити функцію, ви можете використовувати: password_reset = functools.partial (пароль, template_name = "шлях / до / мій / шаблон" )
Аарон Маенпаа

7

Ви можете зробити наступне:

  1. додати до своїх URL-адрес (r '^ / account / password / reset / $', password_reset)
  2. помістіть ваш шаблон у "/templates/registration/password_reset_form.html"
  3. зробіть ваш додаток перед "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 ).

Мотивація підходу:

  1. Я хочу бути більш сухим і не повторювати жоден вигляд (визначений django) ім'я шаблону (вони вже визначені в django)
  2. Я хочу найменший url.py

2

Іншим, можливо, більш простим рішенням є додати каталог шаблонів заміщення до запису 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. Тож перекритий шаблон для скидання пароля був биmy_app/templates/registration/password_reset_form.html


1

У документації сказано, що існує лише одна змінна контекст,form .

Якщо у вас виникли проблеми з входом у систему (що є загальним), у документації зазначено, що є три змінні контексту:

  • form: Об'єкт Form, що представляє форму входу. Докладніше про об’єкти форми див. У документації на форми.
  • next: URL-адреса для переадресації після успішного входу. Це може також містити рядок запиту.
  • site_name: Назва поточного сайту відповідно до налаштувань SITE_ID.

2
У документації йдеться про "необов'язковий аргумент", який називається "template_name", який здається більш релевантним.
jb.

Необов'язковий аргумент - це аргумент функції, а не контекст, наданий формі.
С.Лотт

Ммм - я думаю, що питання бентежить, оскільки він говорить про "контекст", коли дійсно все, що має значення для вирішення цього питання, є аргументами password_reset погляду.
jb.

1

Я використовував ці два рядки в 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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.