2025, Sep 26 11:31
TemplateDoesNotExist समझें: Django LoginView के लिए registration/login.html सेटअप
TemplateDoesNotExist से छुटकारा पाएं: Django LoginView में registration/login.html क्यों नहीं मिलता, APP_DIRS व template_name कैसे सेट करें, सही टेम्पलेट पथ व URLconf.
/accounts/login/ खोलते समय registration/login.html के लिए TemplateDoesNotExist मिलना, Django के बिल्ट‑इन ऑथ व्यूज़ को वायर करते हुए अक्सर होने वाला पेंच है। आप सेटअप पूरा करते हैं, सर्वर चलाते हैं, लॉगिन URL खोलते हैं, और Django शिकायत करता है कि उसे टेम्पलेट नहीं मिला। त्रुटि संदेश दिखाता है कि टेम्पलेट लोडर ज्ञात स्थानों में खोज रहा है, लेकिन आपके ऐप का टेम्पलेट नहीं दिख रहा—ठीक वहीं, जहाँ LoginView डिफ़ॉल्ट रूप से उसे ढूंढता है।
समस्या वाला सेटअप कैसा दिखता है
URLconf बिल्ट‑इन व्यूज़ को इस बिना वायर करता है कि Django को कौन सा टेम्पलेट उपयोग करना चाहिए। जब तक परंपरागत टेम्पलेट टेम्पलेट सर्च पाथ पर मिल जाता है, यह बिल्कुल ठीक काम करता है।
from django.contrib import admin
from django.contrib.auth import views as auth_screens
from django.urls import path
urlpatterns = [
  path("accounts/login/", auth_screens.LoginView.as_view(), name="login"),
  path("accounts/logout/", auth_screens.LogoutView.as_view(), name="logout"),
  path("admin/", admin.site.urls),
]
टेम्पलेट इंजन app directories loader का उपयोग करने के लिए कॉन्फ़िगर है। इसका मतलब है Django हर इंस्टॉल किए गए ऐप के अंदर templates फ़ोल्डर ढूंढेगा और वहीं से टेम्पलेट्स लेगा।
TEMPLATES = [
  {
    "BACKEND": "django.template.backends.django.DjangoTemplates",
    "DIRS": [],
    "APP_DIRS": True,
    "OPTIONS": {
      "context_processors": [
        "django.template.context_processors.request",
        "django.contrib.auth.context_processors.auth",
        "django.contrib.messages.context_processors.messages",
      ],
    },
  },
]
त्रुटि क्यों आती है
Django का LoginView registration/login.html पर एक टेम्पलेट की अपेक्षा करता है। APP_DIRS सक्षम होने पर app_directories लोडर सभी इंस्टॉल किए गए ऐप्स में templates डायरेक्टरी ढूंढता है और उस रिलेटिव पाथ को हल करने की कोशिश करता है। अगर फ़ाइल किसी भी मिली templates डायरेक्टरी में मौजूद नहीं है, या Django आपके फ़ाइल की ओर स्पष्ट रूप से इशारा नहीं करता, तो लोडर TemplateDoesNotExist उठाता है। त्रुटि रिपोर्ट दिखाती है कि Django ज्ञात टेम्पलेट स्थानों की जाँच कर रहा है, लेकिन उसे registration/login.html अपेक्षित जगह पर नहीं मिल रहा।
समाधान
यहाँ दो हिस्से हैं और दोनों का मेल ज़रूरी है। पहला, टेम्पलेट इंजन को वास्तव में आपके ऐप के टेम्पलेट्स देखने चाहिए, इसलिए APP_DIRS True होना चाहिए। दूसरा, या तो फ़ाइल को अपने ऐप में परंपरागत पथ पर रखें, या LoginView को साफ‑साफ बताएँ कि कौन सा टेम्पलेट रेंडर करना है।
सुनिश्चित करें कि टेम्पलेट इंजन इस तरह कॉन्फ़िगर हो:
TEMPLATES = [{
  "BACKEND": "django.template.backends.django.DjangoTemplates",
  "DIRS": [],
  "APP_DIRS": True,
  "OPTIONS": {"context_processors": [
    "django.template.context_processors.request",
    "django.contrib.auth.context_processors.auth",
    "django.contrib.messages.context_processors.messages",
  ]},
}]
लॉगिन टेम्पलेट को अपने ऐप के भीतर परंपरागत स्थान पर रखें:
courses/templates/registration/login.html
और URLconf को स्पष्ट करें, ताकि Django और कहीं भी देखे, व्यू उसी फ़ाइल को resolve करे:
from django.contrib import admin
from django.contrib.auth import views as auth_screens
from django.urls import path
urlpatterns = [
  path(
    "accounts/login/",
    auth_screens.LoginView.as_view(template_name="registration/login.html"),
    name="login",
  ),
  path("accounts/logout/", auth_screens.LogoutView.as_view(), name="logout"),
  path("admin/", admin.site.urls),
]
यह क्यों मायने रखता है
बिल्ट‑इन ऑथ व्यूज़ पूर्वानुमेय टेम्पलेट नामों पर निर्भर करते हैं। अगर आपके प्रोजेक्ट का टेम्पलेट सर्च पाथ या फ़ाइल संरचना इन परंपराओं से हट जाती है, तो रनटाइम पर TemplateDoesNotExist मिलती है। template_name को स्पष्ट रूप से सेट करना अनुमान खत्म करता है और आपका इरादा स्पष्ट करता है। APP_DIRS सक्षम रखने से हर इंस्टॉल ऐप अपने टेम्पलेट्स साथ ला सकता है, बिना अतिरिक्त वायरिंग के।
मुख्य बातें
Django ऑथ स्क्रीन वायर करते समय दो बातों पर सोचें: व्यू डिफ़ॉल्ट रूप से कहां देखता है, और आपका टेम्पलेट वास्तव में कहां रखा है। registration/login.html को ऐप की templates डायरेक्टरी के अंतर्गत रखें, APP_DIRS True रखें, और जब बिल्कुल स्पष्ट होना हो, तो व्यू पर template_name ओवरराइड करें। इससे समय बचता है और बाद में “मेरी मशीन पर तो चलता है” जैसी स्थितियों से बचाव होता है।
यह लेख StackOverflow के प्रश्न (लेखक: Jason Sturgeon) और Umar Sherwani के उत्तर पर आधारित है।