Django प्रोजेक्ट में टेम्प्लेट डालने के लिए सबसे अच्छा स्थान क्या है?


88

Django प्रोजेक्ट में टेम्प्लेट डालने के लिए सबसे अच्छा स्थान क्या है?

जवाबों:


50

Django पुस्तक से, अध्याय 4 :

यदि आप अपने टेम्प्लेट लगाने के लिए एक स्पष्ट स्थान के बारे में नहीं सोच सकते हैं, तो हम आपके Django प्रोजेक्ट के भीतर एक टेम्प्लेट डायरेक्टरी बनाने की सलाह देते हैं (जैसे, आप अध्याय 2 में आपके द्वारा बनाए गए mysite डायरेक्टरी के भीतर, यदि आप हमारे उदाहरणों के साथ अनुसरण कर रहे हैं)।

यह वही है जो मैं करता हूं, और मेरे लिए बहुत अच्छा काम किया है।

मेरी निर्देशिका संरचना कुछ इस तरह दिखती है:

/mediaमुख्य परियोजना कोड (यानी पायथन कोड) के
/templatesलिए मेरे टेम्पलेट के
/projectnameलिए मेरे सभी सीएसएस / जेएस / चित्र आदि के लिए।


1
जब आप टेम्पलेट / टेम्पलेट लगाते हैं, तो क्या django.template.loaders.filesystem.oader के साथ लोड करने के लिए TEMPLATE_DIRS में पूरा पथ निर्दिष्ट किए बिना टेम्पलेट लोडर को बताने का कोई तरीका है? यह एक रिश्तेदार पथ के साथ ऐसा करने के लिए बहुत अच्छा होगा, और 1.4 के तहत मेरा लोडर <प्रोजेक्ट> / टेम्प्लेट के तहत नहीं दिख रहा है
Ciro Santilli Sant do do do

87

<PROJECT>/<APP>/templates/<APP>/template.htmlएप्लिकेशन को विशिष्ट एप्लिकेशन के लिए कहीं और पुन: प्रयोज्य बनाने में मदद करने के लिए रखा गया।

सामान्य "वैश्विक" टेम्प्लेट के लिए मैंने उन्हें अंदर रखा <PROJECT>/templates/template.html


11
2 <APP>एस के लिए आश्चर्य है <PROJECT>/<APP>/templates/<APP>/template.html?
डेविड ज़िया

18
पहला / ऐप / टेम्प्लेट सिर्फ अपने संबंधित ऐप के साथ समूह टेम्पलेट्स के लिए है। दूसरा ऐप नाम की टक्कर को रोकने के लिए है। (संभवतः, आप इन निर्देशिकाओं में से प्रत्येक को इंगित करने के लिए TEMPLATE_DIRS इंगित करेंगे, लेकिन अंत में, Django उन्हें एक विशाल निर्देशिका में एक साथ देता है।) देखें: docs.djangoproject.com/en/dev/ref/templates/api/…
सीज़र ब्यूटिस्टा

3
इसके लिए काम करने के लिए (django 1.6), मुझे फ़ाइल सिस्टम टेम्प्लेट लोडर के लिए निर्देश जोड़ना था:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
फाफमान

3
यह उत्तर प्राचीन है, लेकिन किसी तरह मैं यहाँ समाप्त हुआ। रिकॉर्ड के लिए, TEMPLATE_DIRSअब पदावनत कर रहा है - आप के बजाय जोड़ने चाहिए DIRS=[os.path.join(BASE_DIR, "templates")]करने के लिए TEMPLATES- देखने stackoverflow.com/questions/29725132/...
जॉन हारून

9

डोमिनिक और dlrust से ऊपर,

हम अपने django प्रोजेक्ट और एप्लिकेशन को हमारे अलग-अलग वातावरणों में तैनात करने के लिए एक सेटपूल स्रोत स्रोत वितरण (sdist) का उपयोग करते हैं।

हमने पाया है कि टेम्पलेट्स और स्टैटिक फाइल्स को django एप्लिकेशन डायरेक्टरी के तहत होना चाहिए ताकि उन्हें सेटपूल द्वारा पैक किया जा सके।

उदाहरण के लिए, हमारा टेम्प्लेट और स्थिर पथ इस प्रकार हैं:

PROJECT/APP/templates/APP/template.html
PROJECT/APP/static/APP/my.js

इस काम के लिए, MANIFEST.in को संशोधित किया जाना चाहिए (देखें http://docs.python.org/distutils/sourcedist.html#the-manifest-in-template )

MANIFEST.in का एक उदाहरण:

include setup.py
recursive-include PROJECT *.txt *.html *.js
recursive-include PROJECT *.css *.js *.png *.gif *.bmp *.ico *.jpg *.jpeg

इसके अलावा, आपको अपने django सेटिंग फ़ाइल में यह पुष्टि करने की आवश्यकता है कि app_directories लोडर आपके TEMPLATE_LOADERS में है। मुझे लगता है कि यह django 1.4 में डिफ़ॉल्ट रूप से है।

Django सेटिंग टेम्प्लेट लोडरों का एक उदाहरण:

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

बस अगर आप सोच रहे हैं कि हम rdync फ़ाइलों को कॉपी करने के बजाय sdists का उपयोग क्यों करते हैं; यह हमारे कॉन्फ़िगरेशन प्रबंधन वर्कफ़्लो का हिस्सा है, जहाँ हमारे पास एक एकल बिल्ड टारबॉल है जिसे PIP के साथ परीक्षण, स्वीकृति और उत्पादन वातावरण में अपरिवर्तित किया गया है।


1
+1 अतिरिक्त विवरण और उदाहरण लाइनें प्रदान करने के लिए धन्यवाद।
जन्म

/static/टेम्प्लेट और मॉड्यूलर ऐप के बारे में सोचते समय अपने लेआउट प्लान में शामिल करने के लिए स्मार्ट 1 । आप एक और सबसे अच्छे अभ्यास का उल्लेख करना चाह सकते हैं, इसी तरह cssएक फ़ोल्डर में फाइलें डालते हैं और शायद या बस । static/app/cssjsjpg/static/app/images
hobs

7

DJANGO 1.11

टेम्प्लेट फ़ोल्डर जोड़ें जहां मैनेजमेन्ट मौजूद है, जो आपकी आधार निर्देशिका है। अपनी सेटिंग्स में निम्नलिखित के रूप में टैंपल के लिए डीआईआरएस बदलें

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

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',
        ],
    },
},

]

अब कोड का उपयोग करके टेम्पलेट का उपयोग करने के लिए,

def home(request):
    return render(request,"index.html",{})

विचारों में। यह django 1.11 के लिए पूरी तरह से ठीक काम करता है


1

यह परियोजना-स्तर पर एक व्यक्तिगत पसंद है। यदि आप उन ऐप्स के बारे में बात कर रहे हैं, जिन्हें प्लग करने योग्य होने की आवश्यकता है, तो आपके ऐप में एक टेम्पलेट निर्देशिका वह स्थान है जहां वे डिफ़ॉल्ट जाते हैं। लेकिन प्रोजेक्ट-वाइड, यह वही है जो आपके लिए सबसे अच्छा काम करता है।


1

मुझे समझ में TEMPLATE_DIRSएक पूर्ण मार्ग की आवश्यकता है। और मुझे अपने कोड में पूर्ण पथ पसंद नहीं है। तो यह मेरे लिए अच्छा काम कर रहा है settings.py:

import os

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(os.path.realpath(__file__)),
                 "../APPNAME/templates")
)

1
Django प्रोजेक्ट्स का आधार पथ पहले से ही मानक सेटिंग में बदल दिया गया है BASE_DIR। इसलिए, आप इसे सरल बना सकते हैं:os.path.join(BASE_DIR, '../APPNAME/templates')
एनकाउंटर करें।

1

Django 1.10

TEMPLATE_DIRS पदावनत किया गया है।

अब हम उपयोग करने की आवश्यकता है TEMPLATE, Django 1.8 में शुरू इस तरह:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... some options here ...
        },
    },
]

जब आप TEMPLATES परिभाषित कर लेते हैं, तो आप ALLOWED_INCLUDE_ROOTS, TEMPLATE_CONTEXT_PROCESSORS, TEMPLATE_DEBUG, TEMPLATE_DIRS, TEMPLATE_LOADERS और TEMPLATE_STRING_IF_INVALID निकाल सकते हैं।

सबसे अच्छे स्थान के बारे में, Django इस तरह के टेम्पलेट की तलाश में है:

  • डीआईआरएस निर्देशिकाओं की एक सूची को परिभाषित करता है जहां इंजन को खोज क्रम में टेम्पलेट स्रोत फ़ाइलों के लिए देखना चाहिए।
  • APP_DIRS बताता है कि इंजन को इंस्टॉल किए गए एप्लिकेशन के अंदर टेम्प्लेट दिखना चाहिए या नहीं। प्रत्येक बैकएंड अनुप्रयोगों के अंदर उपनिर्देशिका के लिए एक पारंपरिक नाम को परिभाषित करता है जहां इसके टेम्पलेट संग्रहीत किए जाने चाहिए।

अधिक जानकारी: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration


0

पिछला समाधान मेरे मामले में काम नहीं आया। मैंनें इस्तेमाल किया:

TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]

मेरा जवाब देखो। TEMPLATE_DIRSअब पदावनत कर दिया गया है।
विल्फ्रेड

Django प्रोजेक्ट्स का आधार पथ पहले से ही मानक सेटिंग में बदल गया है BASE_DIR। इसलिए, आप इसे सरल बना सकते हैं:os.path.join(BASE_DIR, '../myapp/templates')
एनकाउंटर करें।

0

आप django-dbtemplates का उपयोग करके डेटाबेस में अपने टेम्प्लेट होने पर भी विचार कर सकते हैं । यह कैशिंग के लिए भी सेटअप है, और django-reversion अनुप्रयोग जो आपको अपने टेम्प्लेट के पुराने संस्करणों को रखने में मदद करता है।

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

[संपादित करें: २० अगस्त २०१ 201 - यह रिपॉजिटरी उपलब्ध नहीं है, एक ही नाम के साथ https://github.com/jazzband/django-dbtemplates पर उपलब्ध है और इसे ago महीने पहले अपडेट किया गया था। मैं अब किसी भी सार्थक तरीके से Django का उपयोग नहीं करता, इसलिए इसके लिए प्रतिज्ञा नहीं कर सकता।]


यह एक अच्छा विचार कब होगा? क्या यह DB से टेम्प्लेट लोड करने के लिए धीमा नहीं है?
jguffey

यदि आप db में टेम्पलेट संग्रहीत करते हैं तो आप db पर निर्भर हो जाते हैं, क्या आप अपने db को git कमिट का हिस्सा बना लेंगे? आप विभिन्न उपयोगकर्ताओं द्वारा टेम्प्लेट में किए गए परिवर्तनों के बीच समन्वय कैसे करेंगे?
गोटामाग्गरवाल

इससे पहले कि मैं git के बारे में पता हो, यह लिखा गया था। यह भी सुनिश्चित नहीं है कि मैं उस समय svn का उपयोग कर रहा था। मैं अब संस्करण नियंत्रण प्रणालियों का उपयोग करने की सलाह दूंगा।
टोनीएम

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