मैं अपने स्वयं के टेम्प्लेट के साथ बिल्ट इन पासवर्ड रीसेट / परिवर्तन के विचारों का उपयोग कैसे करूं


93

उदाहरण के लिए मैं इंगित कर सकते हैं url '^/accounts/password/reset/$'करने के लिए django.contrib.auth.views.password_resetसंदर्भ में मेरे टेम्पलेट फ़ाइल नाम के साथ, लेकिन मैं और अधिक संदर्भ विवरण भेजने के लिए की जरूरत है लगता है।

मुझे यह जानने की आवश्यकता है कि प्रत्येक पासवर्ड रीसेट के लिए कौन सा संदर्भ जोड़ना है और विचार बदलना है।


1
इस प्रश्न के शीर्षक को देखते हुए मुझे नहीं लगता कि contextआप जिस चीज़ की तलाश कर रहे हैं वह सही है!
जेबी

2
बस पुष्टि करने के लिए, "संदर्भ" से मेरा मतलब अतिरिक्त डेटा का शब्दकोश है जो एक यूआरएल लाइन के लिए 3 तर्क है। उर्फ अतिरिक्त डेटा या kwargs । भ्रम के लिए क्षमा करें, प्रश्न को संपादित करें, जो कोई भी कर सकता है।
टॉम विनर

जवाबों:


100

यदि आप django.contrib.auth.views.password_reset के स्रोतों पर एक नज़र डालें तो आप देखेंगे कि यह उपयोग करता है RequestContext। अपशॉट है, आप संदर्भ को संशोधित करने के लिए प्रसंग प्रोसेसर का उपयोग कर सकते हैं जो आपको आवश्यक जानकारी को इंजेक्ट करने की अनुमति दे सकता है।

बी-सूची में संदर्भ प्रोसेसर का अच्छा परिचय है

संपादित करें (मुझे लगता है कि वास्तविक सवाल क्या था के बारे में उलझन में है):

आप देखेंगे कि 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 डिस्क्रिप्शन टपल के तीसरे सदस्य के रूप में एक डिक्शनरी को शामिल करके विचारों की आपूर्ति कर सकते हैं।


मेरा मानना ​​है कि प्रश्न बिलियन व्यूज के साथ विभिन्न टेम्प्लेट का उपयोग करने के बारे में है - संदर्भ प्रोसेसर इसमें कारक नहीं हैं!
जेबी

6
किसी भी विचार, कैसे जाने के लिए registration/password_reset_email.htmlवास्तव में की तरह एचटीएमएल तत्व होते हैं: <div>, <a>क्योंकि इस भेजता पाठ केवल
mabdrabo

@mabdrabo - HTML काम करने के तरीके के बारे में इस लेख को देखें
gregoltsov

26

इस लेख की दृढ़ता से अनुशंसा करें।

मैंने इसे अभी प्लग किया और यह काम किया

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


2
महान लिंक, धन्यवाद। लिंक का अनुसरण करने वालों के लिए - django-registration में अब डिफ़ॉल्ट ऑर्टिकल विचार शामिल हैं ... इसलिए आपको बस इतना करना है कि उपरोक्त लिंक में विस्तृत टेम्प्लेट बनाएं। भी - django-crispy- फॉर्म का उपयोग करें यदि आप सभी मैन्युअल 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 पैटर्न के तीसरे भाग के रूप में एक शब्दकोश में पास कर सकते हैं tuple या, यदि आपको लगता है कि आपको वास्तव में फ़ंक्शन को लपेटना होगा, तो आप उपयोग कर सकते हैं: password_reset = functionalools.partial (पासवर्ड, template_name = "path / to / my / template" )
आरोन मेंपा

7

आप निम्न कार्य कर सकते हैं:

  1. अपने urlpatterns (r '^ / खातों / पासवर्ड / रीसेट / $', password_reset) में जोड़ें
  2. अपना खाका '/templates/registration/password_reset_form.html' में डालें
  3. INSTALLED_APPS में 'django.contrib.auth' से पहले अपना ऐप बनाएं

स्पष्टीकरण:

जब टेम्प्लेट लोड होते हैं, तो उन्हें सेटिंग में आपके 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

एक और, शायद सरल, समाधान यह है कि अपने ओवरराइड टेम्पलेट डायरेक्टरी को सेटिंग्स में DIRS प्रविष्टि TEMPLATES सेटिंग में जोड़ना है। (मुझे लगता है कि यह सेटिंग 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: लॉगिन फॉर्म का प्रतिनिधित्व करने वाला एक फॉर्म ऑब्जेक्ट। प्रपत्र ऑब्जेक्ट पर अधिक के लिए प्रपत्र दस्तावेज़ देखें।
  • next: सफल लॉगिन के बाद रीडायरेक्ट करने वाला URL। इसमें क्वेरी स्ट्रिंग भी हो सकती है।
  • site_name: SITE_ID सेटिंग के अनुसार, वर्तमान साइट का नाम।

2
प्रलेखन का कहना है कि "टेम्पलेट_नाम" नामक एक "वैकल्पिक तर्क" है जो अधिक प्रासंगिक लगता है।
जेबी

वैकल्पिक तर्क फ़ंक्शन का एक तर्क है, प्रपत्र को प्रदान किए गए संदर्भ नहीं।
S.Lott

मम्म- मुझे लगता है कि यह सवाल भ्रामक है कि यह 'संदर्भ' के बारे में बात करता है जब वास्तव में यह हल करने के लिए प्रासंगिक है कि यह password_resetदृश्य के तर्क हैं।
जेबी

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.