ฉันจะใช้การรีเซ็ต / เปลี่ยนรหัสผ่านในตัวด้วยเทมเพลตของฉันเองได้อย่างไร


93

ตัวอย่างเช่นฉันสามารถชี้url '^/accounts/password/reset/$'ไปที่django.contrib.auth.views.password_resetชื่อไฟล์เทมเพลตของฉันในบริบทได้ แต่ฉันคิดว่าจำเป็นต้องส่งรายละเอียดบริบทเพิ่มเติม

ฉันต้องการทราบว่าบริบทใดที่จะเพิ่มสำหรับการรีเซ็ตรหัสผ่านและเปลี่ยนมุมมอง


1
ตั้งชื่อคำถามนี้ฉันไม่คิดว่าcontextใช่สิ่งที่คุณกำลังมองหา!
jb.

2
เพื่อยืนยันโดย "บริบท" ฉันหมายถึงพจนานุกรมของข้อมูลเพิ่มเติมที่เป็นอาร์กิวเมนต์ที่ 3 ของบรรทัด URL ข้อมูลเสริมหรือที่รู้จักหรือkwargs ขออภัยในความสับสนโปรดแก้ไขคำถามทุกคนที่สามารถทำได้
Tom Viner

คำตอบ:


100

หากคุณดูแหล่งที่มาของ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


ฉันเชื่อว่าคำถามเกี่ยวกับการใช้เทมเพลตที่แตกต่างกันที่มีมุมมองในตัว - ตัวประมวลผลบริบทไม่ได้คำนึงถึงมัน!
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 ตอนนี้มีมุมมองการตรวจสอบสิทธิ์เริ่มต้น ... ดังนั้นสิ่งที่คุณต้องทำคือสร้างเทมเพลตตามรายละเอียดในลิงก์ด้านบน นอกจากนี้ - ใช้ django-framed-form หากคุณต้องการหลีกเลี่ยงงานฟอร์ม html แบบแมนนวลทั้งหมดที่เขาทำเช่นกัน
dougvk

มีโค้ด Django ดั้งเดิมที่ฉันต้องจัดการในที่ทำงาน แต่ฉันแทบไม่รู้อะไรเลยเกี่ยวกับเฟรมเวิร์ก ผู้ชายคนนั้นช่วยตูดฉัน! บทช่วยสอนที่ยอดเยี่ยม
Matt Vukas

ขอบคุณสำหรับลิงค์! ฉันคิดว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับตั้งแต่อย่างที่คุณพูดเสียบปลั๊กแล้วมันใช้งานได้
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 = "path / to / my / template" )
Aaron Maenpaa

7

คุณสามารถทำสิ่งต่อไปนี้:

  1. เพิ่มใน urlpatterns ของคุณ (r '^ / accounts / 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: ออบเจ็กต์ฟอร์มที่แสดงถึงฟอร์มการเข้าสู่ระบบ ดูเอกสารประกอบของฟอร์มสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวัตถุแบบฟอร์ม
  • 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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.