자체 템플릿으로 기본 제공 암호 재설정 / 변경보기를 사용하는 방법


92

예를 들어 컨텍스트에서 내 템플릿 파일 이름으로 url '^/accounts/password/reset/$'를 가리킬 수 django.contrib.auth.views.password_reset있지만 더 많은 컨텍스트 세부 정보를 보내야한다고 생각합니다.

각 암호 재설정 및보기 변경에 대해 추가 할 컨텍스트를 정확히 알아야합니다.


1
이 질문의 제목을 감안할 때 context귀하가 찾고있는 것이 옳지 않다고 생각 합니다!
jb.

2
확인하기 위해 "컨텍스트"란 URL 행에 대한 세 번째 인수 인 추가 데이터 사전을 의미했습니다. 일명 추가 데이터 또는 kwargs . 혼동을 드려 죄송합니다. 질문을 수정할 수있는 사람이라면 누구나 수정 해주세요.
Tom Viner 2011

답변:


100

당신이 소스에서 살펴 경우 django.contrib.auth.views.password_reset 당신은 그것을 사용하는 것을 볼 수 있습니다 RequestContext. 결론은 컨텍스트 프로세서를 사용하여 필요한 정보를 삽입 할 수있는 컨텍스트를 수정할 수 있다는 것입니다.

b-list에는 컨텍스트 프로세서에 대한 좋은 소개가 있습니다.

편집 (실제 질문이 무엇인지 혼란스러워하는 것 같습니다) :

다음과 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'/accounts/password/reset'키워드 인수와 일치하는 URL에 대해 호출됩니다 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 작동 방법에 대한 이 기사 를 확인하십시오 .
gregoltsov

26

이 기사를 강력히 추천합니다.

방금 꽂았 고 작동했습니다.

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


2
좋은 링크, 감사합니다. 링크를 따르는 사람들을 위해-django-registration은 이제 기본 인증보기를 포함하므로 위의 링크에 자세히 설명 된 템플릿을 생성하기 만하면됩니다. 또한-그가 한 모든 수동 HTML 양식 작업을 피하려면 django-crispy-forms를 사용하십시오.
dougvk 2013-08-24

직장에서 관리해야하는 레거시 Django 코드가 있지만 프레임 워크에 대해 거의 알지 못합니다. 그 남자가 내 엉덩이를 구했어! 훌륭한 튜토리얼
Matt Vukas 2014

링크 주셔서 감사합니다! 나는 이것이 당신이 말한 것처럼 그것을 연결하고 작동했기 때문에 받아 들여지는 대답이어야한다고 생각합니다.
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 (password, template_name = "path / to / my / template" )
Aaron Maenpaa

7

다음을 수행 할 수 있습니다.

  1. urlpatterns에 추가 (r '^ / accounts / password / reset / $', password_reset)
  2. 템플릿을 '/templates/registration/password_reset_form.html'에 넣으십시오.
  3. INSTALLED_APPS에서 앱이 'django.contrib.auth'앞에 오도록합니다.

설명:

템플릿이로드되면 settings.py의 INSTALLED_APPS 변수에서 검색됩니다. 순서는 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

아마도 더 간단한 또 ​​다른 해결책은 settings.py의 TEMPLATES 설정의 DIRS 항목에 재정의 템플릿 디렉토리를 추가하는 것입니다. (이 설정은 Django 1.8의 새로운 설정이라고 생각합니다. 이전 Django 버전에서는 TEMPLATE_DIRS라고 불렸을 수 있습니다.)

이렇게 :

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 객체입니다. Form 객체에 대한 자세한 내용은 양식 설명서를 참조하십시오.
  • next: 로그인 성공 후 리디렉션 할 URL입니다. 여기에는 쿼리 문자열도 포함될 수 있습니다.
  • site_name: SITE_ID 설정에 따른 현재 사이트의 이름입니다.

2
문서에는 "template_name"이라는 "선택적 인수"가 더 관련성이있는 것으로 나와 있습니다.
jb.

선택적 인수는 양식에 제공된 컨텍스트가 아니라 함수에 대한 인수입니다.
S.Lott

음-저는이 문제를 해결하는 데 관련된 모든 것이 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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.