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


91

ฉันกำลังติดตามบทช่วยสอนนี้เกี่ยวกับสภาพแวดล้อม Windows 7

ไฟล์การตั้งค่าของฉันมีคำจำกัดความนี้:

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

ผมได้base_templateจากแม่แบบadmin/base_site.htmlจากภายในเริ่มต้น Django ไดเรกทอรีผู้ดูแลระบบแม่แบบในซอร์สโค้ดของ Django ตัวเอง (Django / contrib / ธุรการ / แม่) เป็นผู้ดูแลระบบไดเรกทอรีย่อยของmyappไดเรกทอรีเป็นกวดวิชาสั่ง แต่มันก็ไม่ได้ดูเหมือนจะมีผล ด้วยเหตุผลบางอย่าง.

มีเงื่อนงำอะไรที่อาจเป็นปัญหา?

คำตอบ:


184

ฉันรู้ว่าสิ่งนี้ไม่ได้อยู่ในบทช่วยสอน 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',
]

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

คุณจะต้องเรียกใช้ syncdb หากคุณยังไม่ได้รัน คุณจะต้องเซิร์ฟเวอร์ไฟล์มีเดียของคุณแบบคงที่หากคุณโฮสต์ django ผ่านรันเนอร์


1
ขอบคุณมากที่ลบ "/ admin" ในตอนท้ายของพา ธ สัมพัทธ์ TEMPLATE_DIRS ทำได้
shaytac

1
คำแนะนำนี้ทำให้ไดเร็กทอรี template อยู่ในโฟลเดอร์โครงการ สำหรับองค์กรที่ดีขึ้นควรใส่ไว้ในโฟลเดอร์ของแอปแทนหรือไม่
Sahas Katta

2
สิ่งนี้ช่วยแก้ปัญหาของฉันได้ ขอบคุณ. แต่ไฟล์การตั้งค่าเริ่มต้นมีความคิดเห็นกับ TEMPLATE_DIRS ว่า "อย่าลืมใช้เส้นทางสัมบูรณ์ไม่ใช่เส้นทางสัมพัทธ์" ไม่มีใครรู้เหตุผลสำหรับความคิดเห็นนั้น?
bhekman

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

2
ฉันขอแนะนำให้ใช้os.path.joinเพื่อผนวกพา ธ ไปยังฐาน dir
antonagestam

35

หากใช้การตั้งค่า Django ตามที่ติดตั้งไว้ทำไมไม่ใช้ BASE_DIR และ TEMPLATES ที่กำหนดไว้ล่วงหน้าแล้วล่ะ ใน pip ที่ติดตั้ง 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 + '/ template /', »นี้เป็นเคล็ดลับ และดูสง่างามมากกว่าส่วนแยกด้วย
Maxiller

2
ใช้os.path.join(BASE_DIR, 'templates')สำหรับเส้นทางที่จะเป็นอิสระจากแพลตฟอร์ม
Abhyudai

12

โซลูชันอัจฉริยะใน 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],
...

ใน views.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 คุณสามารถตั้งค่าพา ธ เทมเพลตแบ็กเอนด์และพารามิเตอร์อื่น ๆ สำหรับเทมเพลตในพจนานุกรมเดียว ( settings.py ):

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, 'template'),)
renderbox

6

ฉันยังมีปัญหากับส่วนนี้ของบทช่วยสอน (ใช้บทช่วยสอนสำหรับเวอร์ชัน 1.7)

ความผิดพลาดของฉันคือฉันแก้ไขสตริง "การดูแลระบบ Django" เท่านั้นและไม่ได้ใส่ใจกับคู่มือนี้มากพอ

นี่คือบรรทัดจากdjango / Contrib / admin / templates / admin / base_site.html :

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

แต่หลังจากเวลาผ่านไปและความไม่พอใจก็เห็นได้ชัดว่ามีคำสั่ง 'site_header หรือ default: _' ซึ่งควรลบออก ดังนั้นหลังจากลบคำสั่ง (เช่นตัวอย่างในคู่มือทุกอย่างทำงานตามที่คาดไว้)

ตัวอย่างคู่มือ:

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

2

เอาล่ะ😁สมมติว่าคุณมีโปรเจ็กต์ใหม่ถ้าเป็นเช่นนั้นคุณจะไปที่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

ป.ล. : หากคุณตั้งชื่อโฟลเดอร์เทมเพลตด้วยชื่ออื่นคุณจะเปลี่ยนที่นี่ด้วย


2

ใน django 3.1 ไปที่การตั้งค่าโครงการของคุณและนำเข้าระบบปฏิบัติการ

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


1

ตรงกันข้ามกับคำตอบบางส่วนที่โพสต์ในเธรดนี้การเพิ่ม'DIRS': ['templates']ไม่มีผลใด ๆ (ซ้ำซ้อน) เนื่องจากtemplatesเป็นเส้นทางเริ่มต้นที่ Django ค้นหาเทมเพลต

ถ้าคุณกำลังพยายามที่จะอ้างอิงแม่แบบของแอปตรวจสอบให้แน่ใจว่าแอปของคุณอยู่ในรายชื่อของโครงการหลักINSTALLED_APPSsettings.py

INSTALLED_APPS': [
   # ...
   'my_app',
]

อ้างถึงเอกสารเทมเพลตของ Django :

คลาสDjangoTemplates¶

ตั้งค่า BACKEND เป็น 'django.template.backends.django.DjangoTemplates' เพื่อกำหนดค่าเอ็นจินเทมเพลต Django

เมื่อ APP_DIRS เป็น True เอ็นจิน DjangoTemplates จะค้นหาเทมเพลตในไดเร็กทอรีย่อยเทมเพลตของแอปพลิเคชันที่ติดตั้ง ชื่อสามัญนี้ถูกเก็บไว้เพื่อความเข้ากันได้แบบย้อนกลับ

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

นี่คืออีกย่อหน้าหนึ่งจากเอกสารDjango Tutorialซึ่งชัดเจนยิ่งขึ้น:

การตั้งค่า TEMPLATES ของโปรเจ็กต์จะอธิบายวิธีที่ Django จะโหลดและแสดงผลเทมเพลต ไฟล์การตั้งค่าเริ่มต้นจะกำหนดค่าแบ็กเอนด์ DjangoTemplates ซึ่งมีตัวเลือก APP_DIRS เป็น True ตามแบบแผน DjangoTemplates จะมองหาไดเร็กทอรีย่อย "แม่แบบ" ใน INSTALLED_APPS แต่ละรายการ


1
พูดได้ดี. ควรกล่าวถึงเอกสารเทมเพลตและสิ่งที่กล่าวเกี่ยวกับtemplatesไดเร็กทอรี
ivanleoncz

0

โดยทั่วไปBASE_DIRเป็นไดเรกทอรีโครงการ Django ผบเดียวที่คุณ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',
                ],
            },
        },
    ]

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