Django टेम्पलेट पथ


88

मैं ट्यूटोरियल का अनुसरण कर रहा हूं विंडोज 7 वातावरण में http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02 । मेरी सेटिंग फ़ाइल है:

TEMPLATE_DIRS = (
    'C:/django-project/myapp/mytemplates/admin'
)

मुझे मिला base_template टेम्पलेट से admin/base_site.htmlDjango खुद के स्रोत कोड में डिफ़ॉल्ट Django व्यवस्थापक टेम्पलेट निर्देशिका के भीतर से (Django / योगदान / व्यवस्थापक / टेम्पलेट्स) ट्यूटोरियल निर्देश दिए रूप MyApp निर्देशिका के व्यवस्थापक उपनिर्देशिका में।

यह किसी कारण से प्रभावित नहीं लगता है। समस्या का कोई भी सुराग क्या हो सकता है? क्या मुझे एक सिंक डीबी करना है?

जवाबों:


182

मुझे पता है कि यह Django ट्यूटोरियल में नहीं है, और उन पर शर्म की बात है, लेकिन अपने पथ चर के लिए सापेक्ष पथ सेट करना बेहतर है। आप इसे इस तरह सेट कर सकते हैं:

import os.path

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

...

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media/')

TEMPLATE_DIRS = [
    os.path.join(PROJECT_PATH, 'templates/'),
]

इस तरह से आप अपने Django प्रोजेक्ट को स्थानांतरित कर सकते हैं और आपके रास्ते की जड़ें अपने आप अपडेट हो जाएंगी। यह उपयोगी है जब आप अपना उत्पादन सर्वर सेट कर रहे हैं।

दूसरा, आपके TEMPLATE_DIRS पथ पर कुछ संदिग्ध है। यह आपके टेम्प्लेट डायरेक्टरी के रूट को इंगित करना चाहिए। इसके अलावा, यह भी एक अनुगामी में समाप्त होना चाहिए/

मैं यहां केवल अनुमान लगाने जा रहा हूं कि .../admin/निर्देशिका आपकी टेम्पलेट रूट नहीं है। यदि आप अभी भी निरपेक्ष पथ लिखना चाहते हैं, तो आपको व्यवस्थापक टेम्पलेट निर्देशिका के संदर्भ को बाहर निकालना चाहिए।

TEMPLATE_DIRS = [
    'C:/django-project/myapp/mytemplates/',
]

कहा जा रहा है कि, डिफ़ॉल्ट रूप से टेम्प्लेट लोडर को टेम्प्लेट फ़ाइलों का पता लगाने के लिए अपने ऐप निर्देशिकाओं में पुनरावृत्ति करने के लिए सेट किया जाना चाहिए।

TEMPLATE_LOADERS = [
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    # 'django.template.loaders.eggs.load_template_source',
]

जब तक आप विशेष रूप से कुछ अधिलेखित नहीं करना चाहते हैं, तो आपको व्यवस्थापक टेम्पलेट्स पर कॉपी करने की आवश्यकता नहीं होनी चाहिए।

यदि आपने इसे अभी तक नहीं चलाया है, तो आपको एक सिंकबैंक चलाना होगा। यदि आप रनसरवर के माध्यम से django की मेजबानी कर रहे हैं, तो आपको अपनी मीडिया फ़ाइलों को सांख्यिकीय रूप से सर्वर करने की आवश्यकता होगी।


1
TEMPLATE_DIRS रिश्तेदार पथ के अंत में "/ व्यवस्थापक" को हटाने के लिए बहुत बहुत धन्यवाद।
शायात

1
यह सुझाव प्रोजेक्ट फ़ोल्डर के अंदर टेम्प्लेट डायरेक्टरी को डालता है। बेहतर संगठन के लिए, क्या इसके बजाय इसे ऐप के फ़ोल्डर के अंदर रखने का अधिक अर्थ है?
सहस कत्त

2
इससे मेरी समस्या ठीक हो गई। धन्यवाद। लेकिन, डिफ़ॉल्ट सेटिंग फ़ाइल में TEMPLATE_DIRS के साथ एक टिप्पणी थी, "निरपेक्ष पथों का उपयोग करना न भूलें, न कि सापेक्ष पथ।" क्या किसी को उस टिप्पणी का औचित्य पता है?
भेकमैन

1
PROJECT_PATH प्रोजेक्ट फ़ोल्डर का पूर्ण पथ है। यह विधि निरपेक्ष मीडिया पथ को गतिशील रूप से रनटाइम पर सेट करती है ताकि मान हार्ड कोडित न हो और परियोजना के स्थान के साथ स्वचालित रूप से बदल सके। यह एक पुरानी पोस्ट है, लेकिन आप इसका उपयोग प्रोजेक्ट में किसी भी फ़ोल्डर या फ़ाइल के स्थान को परिभाषित करने के लिए कर सकते हैं।
digitaldreamer

2
मैं os.path.joinआधार डिर के लिए रास्तों का उपयोग करने का सुझाव दूंगा।
एनाटागैस्टेम

34

यदि Django सेटिंग्स का उपयोग कर के रूप में स्थापित किया गया है, तो क्यों न केवल इसके बेक्ड-इन, पूर्वनिर्धारित BASE_DIR और TEMPLATES का उपयोग करें? पाइप में स्थापित Django (v1.8), मुझे मिलता है:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            ### ADD YOUR DIRECTORY HERE LIKE SO:
            BASE_DIR + '/templates/',
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

1
इस «BASE_DIR + '/ टेम्प्लेट /',» ने चाल चली। और यह अलग अनुभाग के बजाय अधिक सुरुचिपूर्ण तरीके से दिखता है।
मैक्सिलर

2
os.path.join(BASE_DIR, 'templates')स्वतंत्र होने के लिए पथ का उपयोग करें ।
अभ्युदय

11

परियोजना निर्देशिका में टेम्पलेट्स रखने के लिए Django 2.0.3 में स्मार्ट समाधान (/root/templates/app_name :

settings.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMP_DIR = os.path.join(BASE_DIR, 'templates')
...
TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMP_DIR],
...

view.py में अभी ऐसे टेम्पलेट पथ जोड़ें:

app_name/html_name

9

Django के लिए 1.6.6:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DIRS = os.path.join(BASE_DIR, 'templates')

डिबग और प्रोडक्शन मोड के लिए भी स्थिर और मीडिया:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
else:
    STATIC_ROOT = %REAL_PATH_TO_PRODUCTION_STATIC_FOLDER%
    MEDIA_ROOT = %REAL_PATH_TO_PRODUCTION_MEDIA_FOLDER%

Urls.py में आपको जोड़ना होगा:

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

from news.views import Index

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    ...
    )

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Django 1.8 में आप टेम्प्लेट पथ, बैकएंड और अन्य मापदंडों को एक डिक्शनरी ( सेटिंग ओडोमॉक ) में सेट कर सकते हैं :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

आधिकारिक डॉक्स।


टेम्प्लेट पथ को टपल बनाने की आवश्यकता है: इस TEMPLATE_DIRS = (os.path.join (BASE_DIR, 'टेम्प्लेट') का उपयोग करें,)
रेंडरबॉक्स

6

मेरे पास ट्यूटोरियल के इस भाग के साथ समस्याएं भी थीं (संस्करण 1.7 के लिए ट्यूटोरियल का उपयोग किया गया)।

मेरी गलती यह थी कि मैंने केवल 'Django प्रशासन' स्ट्रिंग को संपादित किया, और मैनुअल पर पर्याप्त ध्यान नहीं दिया।

यह django / contrib / व्यवस्थापक / टेम्पलेट / व्यवस्थापक / base_site.html से पंक्ति है :

<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>

लेकिन कुछ समय और निराशा के बाद यह स्पष्ट हो गया कि 'साइट_हेडर या डिफ़ॉल्ट: _' स्टेटमेंट था, जिसे हटा दिया जाना चाहिए। इसलिए बयान को हटाने के बाद (मैनुअल में उदाहरण के रूप में सब कुछ उम्मीद की तरह काम किया)।

उदाहरण मैनुअल:

<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>

2

ठीक है right मान लीजिए कि आपके पास एक बिल्कुल नया प्रोजेक्ट है, यदि आप settings.pyफ़ाइल में जाना चाहते हैं और TEMPLATESएक बार खोज लेंगे तो पाएंगे कि आपने इस पंक्ति को अंत os.path.join(BASE_DIR, 'template')में चिपका दिया है 'DIRS', आपको कुछ इस तरह से मिलना चाहिए:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'template')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

यदि आप जानना चाहते हैं कि आपकी BASE_DIR निर्देशिका कहाँ स्थित है तो इन 3 सरल कमांडों को टाइप करें:

python3 manage.py shell

एक बार जब आप खोल में हों:

>>> from django.conf import settings
>>> settings.BASE_DIR

PS: यदि आपने अपने टेम्पलेट फोल्डर का नाम दूसरे नाम से रखा है, तो आप इसे यहां भी बदल देंगे।


2

Django 3.1 में, अपनी परियोजना की सेटिंग पर जाएं और os आयात करें

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


0

मूल रूप BASE_DIRसे आपकी django परियोजना निर्देशिका है, वही dir जहां manage.pyहै।

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.