ตำแหน่งที่ดีที่สุดในการใส่เทมเพลตในโครงการ django คืออะไร?


คำตอบ:


50

จากหนังสือ Django ตอนที่ 4 :

หากคุณไม่สามารถนึกถึงตำแหน่งที่ชัดเจนในการใส่เทมเพลตของคุณได้เราขอแนะนำให้สร้างไดเร็กทอรีเทมเพลตภายในโปรเจ็กต์ Django ของคุณ (กล่าวคือภายในไดเร็กทอรี mysite ที่คุณสร้างในบทที่ 2 หากคุณได้ติดตามพร้อมกับตัวอย่างของเรา)

นี่คือสิ่งที่ฉันทำและได้ผลดีสำหรับฉัน

โครงสร้างไดเร็กทอรีของฉันมีลักษณะดังนี้:

/mediaสำหรับ CSS / JS / images ฯลฯ
/templatesของฉันทั้งหมด
/projectnameสำหรับเทมเพลตของฉันสำหรับรหัสโครงการหลัก (เช่นรหัส Python)


1
เมื่อคุณใส่แม่แบบใน / แม่แบบมีวิธีบอกให้ตัวโหลดเทมเพลตโหลดโดยไม่ระบุพา ธ เต็มไปยัง / แม่แบบใน TEMPLATE_DIRS เพื่อโหลดด้วย django.template.loaders.filesystem.Loader หรือไม่ จะเป็นการดีที่จะทำเช่นนี้กับเส้นทางสัมพัทธ์และต่ำกว่า 1.4 ตัวโหลดของฉันไม่ได้มองภายใต้ <โครงการ> / แม่แบบ
Ciro Santilli 郝海东冠状病六四事件法轮功

89

วางไว้ใน<PROJECT>/<APP>/templates/<APP>/template.htmlเทมเพลตเฉพาะแอปเพื่อช่วยในการทำให้แอปใช้ซ้ำได้ที่อื่น

สำหรับเทมเพลต "ทั่วโลก" ทั่วไปฉันใส่ไว้ <PROJECT>/templates/template.html


11
สงสัยเหตุผลของ 2 <APP>วินาที<PROJECT>/<APP>/templates/<APP>/template.html?
David Xia

18
แรก / app / template เป็นเพียงการจัดกลุ่มแม่แบบกับแอปที่เกี่ยวข้อง แอพที่สองคือป้องกันการชนชื่อ (สมมติว่าคุณจะชี้ TEMPLATE_DIRS ให้ชี้ไปที่แต่ละไดเรกทอรีเหล่านี้ แต่ในท้ายที่สุด Django จะรวมกันเป็นไดเรกทอรีขนาดยักษ์เดียว) ดู: docs.djangoproject.com/en/dev/ref/templates/api/…
Ceasar Bautista

3
เพื่อให้ใช้งานได้ (django 1.6) ฉันต้องเพิ่มคำสั่งสำหรับตัวโหลดเทมเพลตระบบไฟล์:TEMPLATE_DIRS = (os.path.join(BASE_DIR, "templates"))
Fafaman

3
คำตอบนี้เป็นคำตอบโบราณ แต่อย่างใดฉันก็มาถึง สำหรับบันทึกTEMPLATE_DIRSนี้เลิกใช้แล้ว - คุณควรเพิ่มลงDIRS=[os.path.join(BASE_DIR, "templates")]ในTEMPLATES- ดูstackoverflow.com/questions/29725132/…
John Aaron

9

ติดตามจาก 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 โดยไม่เปลี่ยนแปลงในสภาพแวดล้อมการทดสอบการยอมรับและการผลิต


1
+1 ขอบคุณที่ให้รายละเอียดเพิ่มเติมและบรรทัดตัวอย่าง
gotgenes

+1 อย่างชาญฉลาดที่จะรวม/static/ไว้ในแผนผังการจัดวางของคุณเมื่อคิดถึงเทมเพลตและแอปแบบแยกส่วน คุณอาจต้องการที่จะพูดถึงอีกวิธีที่ดีที่สุดที่วางcssไฟล์ในโฟลเดอร์ที่เรียกว่าstatic/app/cssเช่นเดียวกันสำหรับjsและอาจจะหรือเพียงแค่jpg /static/app/images
เตาปรุงอาหาร

8

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


1

นี่เป็นทางเลือกส่วนบุคคลในระดับโครงการมากกว่า หากคุณกำลังพูดถึงแอปที่ต้องเสียบปลั๊กไดเร็กทอรีเทมเพลตในแอปของคุณจะเป็นจุดเริ่มต้น แต่ทั้งโครงการเป็นสิ่งที่ดีที่สุดสำหรับคุณ


1

ฉันเข้าใจว่าTEMPLATE_DIRSต้องการเส้นทางที่แน่นอน และฉันไม่ชอบเส้นทางที่แน่นอนในโค้ดของฉัน สิ่งนี้ใช้ได้ดีสำหรับฉันในsettings.py:

import os

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

1
โครงการ Django มีเส้นทางพื้นฐานที่กำหนดไว้แล้วใน settings.py มาตรฐานBASE_DIRดังนั้นคุณสามารถลดความซับซ้อนนี้เป็น:os.path.join(BASE_DIR, '../APPNAME/templates')
60

1

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 กำลังมองหาเทมเพลตเช่นนี้:

  • DIRSกำหนดรายการไดเร็กทอรีที่เอ็นจินควรค้นหาไฟล์ต้นฉบับของเทมเพลตตามลำดับการค้นหา
  • 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เลิกใช้แล้ว
Wilfried

โครงการ Django มีเส้นทางพื้นฐานที่กำหนดไว้แล้วใน settings.py มาตรฐานBASE_DIRดังนั้นคุณสามารถลดความซับซ้อนนี้เป็น:os.path.join(BASE_DIR, '../myapp/templates')
60

0

คุณสามารถพิจารณาการมีเทมเพลตของคุณในฐานข้อมูลโดยใช้django-dbtemplates Django-dbtemplatesนอกจากนี้ยังตั้งค่าสำหรับการแคชและแอปพลิเคชัน django-reversion ซึ่งช่วยให้คุณเก็บเทมเพลตเวอร์ชันเก่าไว้ได้

ใช้งานได้ดี แต่ฉันต้องการความยืดหยุ่นมากกว่านี้เล็กน้อยในการนำเข้า / ซิงค์ไปยัง / จากฝั่งระบบไฟล์

[แก้ไข: 20 ส.ค. 2018 - ที่เก็บนี้ไม่มีให้ใช้งานมีอยู่ที่https://github.com/jazzband/django-dbtemplatesและอัปเดตเมื่อ 8 เดือนที่แล้ว ฉันไม่ได้ใช้ Django ในทางที่มีความหมายอีกต่อไปดังนั้นจึงไม่สามารถรับรองสิ่งนี้ได้]


นี่เป็นความคิดที่ดีเมื่อใด การโหลดเทมเพลตจากฐานข้อมูลช้าลงไม่ใช่หรือ
jguffey

คุณไม่ต้องพึ่งพาฐานข้อมูลหากคุณจัดเก็บเทมเพลตใน db plus คุณจะทำให้ฐานข้อมูลของคุณเป็นส่วนหนึ่งของคอมมิตคอมมิตหรือไม่? คุณจะประสานงานระหว่างการเปลี่ยนแปลงที่ทำโดยผู้ใช้ต่าง ๆ ในเทมเพลตอย่างไร
gautamaggarwal

นี่เป็นวิธีการเขียนก่อนที่ฉันจะตระหนักถึงคอมไพล์ ไม่แน่ใจด้วยซ้ำว่าตอนนั้นฉันใช้ svn ฉันขอแนะนำให้ใช้ระบบควบคุมเวอร์ชันตอนนี้
TonyM

@tonemcd ที่เก็บนี้ถูกลบแล้ว
lmiguelvargasf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.