ตำแหน่งที่ดีที่สุดในการใส่เทมเพลตในโครงการ django คืออะไร?
ตำแหน่งที่ดีที่สุดในการใส่เทมเพลตในโครงการ django คืออะไร?
คำตอบ:
จากหนังสือ Django ตอนที่ 4 :
หากคุณไม่สามารถนึกถึงตำแหน่งที่ชัดเจนในการใส่เทมเพลตของคุณได้เราขอแนะนำให้สร้างไดเร็กทอรีเทมเพลตภายในโปรเจ็กต์ Django ของคุณ (กล่าวคือภายในไดเร็กทอรี mysite ที่คุณสร้างในบทที่ 2 หากคุณได้ติดตามพร้อมกับตัวอย่างของเรา)
นี่คือสิ่งที่ฉันทำและได้ผลดีสำหรับฉัน
โครงสร้างไดเร็กทอรีของฉันมีลักษณะดังนี้:
/media
สำหรับ CSS / JS / images ฯลฯ
/templates
ของฉันทั้งหมด
/projectname
สำหรับเทมเพลตของฉันสำหรับรหัสโครงการหลัก (เช่นรหัส Python)
วางไว้ใน<PROJECT>/<APP>/templates/<APP>/template.html
เทมเพลตเฉพาะแอปเพื่อช่วยในการทำให้แอปใช้ซ้ำได้ที่อื่น
สำหรับเทมเพลต "ทั่วโลก" ทั่วไปฉันใส่ไว้ <PROJECT>/templates/template.html
<APP>
วินาที<PROJECT>/<APP>/templates/<APP>/template.html
?
TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
TEMPLATE_DIRS
นี้เลิกใช้แล้ว - คุณควรเพิ่มลงDIRS=[os.path.join(BASE_DIR, "templates")]
ในTEMPLATES
- ดูstackoverflow.com/questions/29725132/…
ติดตามจาก Dominic และ dlrust
เราใช้ setuptools source distribution (sdist) เพื่อจัดแพ็กเกจโปรเจ็กต์ django และแอพเพื่อปรับใช้ในสภาพแวดล้อมที่แตกต่างกันของเรา
เราพบว่าเทมเพลตและไฟล์แบบคงที่ต้องอยู่ภายใต้ไดเร็กทอรีแอปพลิเคชัน django เพื่อให้สามารถจัดแพ็กเกจโดย setuptools
ตัวอย่างเช่นเทมเพลตและเส้นทางแบบคงที่ของเรามีลักษณะดังนี้:
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',
)
ในกรณีที่คุณสงสัยว่าทำไมเราถึงใช้ sdists แทนที่จะจัดการไฟล์ rsync เป็นส่วนหนึ่งของเวิร์กโฟลว์การจัดการการกำหนดค่าของเราที่เรามี tarball บิลด์เดียวที่ปรับใช้กับ PIP โดยไม่เปลี่ยนแปลงในสภาพแวดล้อมการทดสอบการยอมรับและการผลิต
/static/
ไว้ในแผนผังการจัดวางของคุณเมื่อคิดถึงเทมเพลตและแอปแบบแยกส่วน คุณอาจต้องการที่จะพูดถึงอีกวิธีที่ดีที่สุดที่วางcss
ไฟล์ในโฟลเดอร์ที่เรียกว่าstatic/app/css
เช่นเดียวกันสำหรับjs
และอาจจะหรือเพียงแค่jpg
/static/app/images
DJANGO 1.11
เพิ่มโฟลเดอร์เทมเพลตที่มี Manage.py ซึ่งเป็นไดเร็กทอรีฐานของคุณ เปลี่ยน DIRS สำหรับ TEMPLATES ดังต่อไปนี้ใน settings.py ของคุณ
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",{})
ใน views.py มันใช้งานได้ดีสำหรับ django 1.11
นี่เป็นทางเลือกส่วนบุคคลในระดับโครงการมากกว่า หากคุณกำลังพูดถึงแอปที่ต้องเสียบปลั๊กไดเร็กทอรีเทมเพลตในแอปของคุณจะเป็นจุดเริ่มต้น แต่ทั้งโครงการเป็นสิ่งที่ดีที่สุดสำหรับคุณ
ฉันเข้าใจว่าTEMPLATE_DIRS
ต้องการเส้นทางที่แน่นอน และฉันไม่ชอบเส้นทางที่แน่นอนในโค้ดของฉัน สิ่งนี้ใช้ได้ดีสำหรับฉันในsettings.py
:
import os
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(os.path.realpath(__file__)),
"../APPNAME/templates")
)
BASE_DIR
ดังนั้นคุณสามารถลดความซับซ้อนนี้เป็น:os.path.join(BASE_DIR, '../APPNAME/templates')
Django 1.10.0
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 กำลังมองหาเทมเพลตเช่นนี้:
ข้อมูลเพิ่มเติม: https://docs.djangoproject.com/en/1.10/topics/templates/#configuration
วิธีแก้ปัญหาก่อนหน้านี้ไม่ได้ผลในกรณีของฉัน ฉันใช้:
TEMPLATE_DIRS = [ os.path.join(os.path.dirname(os.path.realpath(__file__)),"../myapp/templates") ]
TEMPLATE_DIRS
เลิกใช้แล้ว
BASE_DIR
ดังนั้นคุณสามารถลดความซับซ้อนนี้เป็น:os.path.join(BASE_DIR, '../myapp/templates')
คุณสามารถพิจารณาการมีเทมเพลตของคุณในฐานข้อมูลโดยใช้django-dbtemplates Django-dbtemplatesนอกจากนี้ยังตั้งค่าสำหรับการแคชและแอปพลิเคชัน django-reversion ซึ่งช่วยให้คุณเก็บเทมเพลตเวอร์ชันเก่าไว้ได้
ใช้งานได้ดี แต่ฉันต้องการความยืดหยุ่นมากกว่านี้เล็กน้อยในการนำเข้า / ซิงค์ไปยัง / จากฝั่งระบบไฟล์
[แก้ไข: 20 ส.ค. 2018 - ที่เก็บนี้ไม่มีให้ใช้งานมีอยู่ที่https://github.com/jazzband/django-dbtemplatesและอัปเดตเมื่อ 8 เดือนที่แล้ว ฉันไม่ได้ใช้ Django ในทางที่มีความหมายอีกต่อไปดังนั้นจึงไม่สามารถรับรองสิ่งนี้ได้]