เทมเพลต Django ไม่เคยมีอยู่?


163

เครื่องในพื้นที่ของฉันใช้ Python 2.5 และ Nginx บน Ubuntu 8.10 โดย Django ถูกสร้างขึ้นจากการพัฒนาล่าสุด

สำหรับทุก URL ที่ฉันขอมันจะโยน:

TemplateDoesNotExist ที่ / appname / path appname / template_name.html

Django พยายามโหลดเทมเพลตเหล่านี้ตามลำดับนี้: * การใช้โหลดเดอร์ django.template.loaders.filesystem.function: * ใช้โหลดเดอร์ django.template.loaders.app_directories.function:

TEMPLATE_DIRS ('/usr/lib/python2.5/site-packages/projectname/templates',)

มันกำลังมองหา/usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.htmlในกรณีนี้หรือไม่ สิ่งที่แปลกคือไฟล์นี้มีอยู่ในดิสก์ ทำไม Django ถึงหาไม่เจอ?

ฉันเรียกใช้แอปพลิเคชันเดียวกันบนเซิร์ฟเวอร์ระยะไกลด้วย Python 2.6 บน Ubuntu 9.04 โดยไม่มีปัญหาดังกล่าว การตั้งค่าอื่น ๆ เหมือนกัน

มีสิ่งใดที่กำหนดค่าผิดพลาดในเครื่องของฉันหรือสิ่งที่อาจทำให้เกิดข้อผิดพลาดที่ฉันควรพิจารณา

ในsettings.pyของฉันฉันได้ระบุ:

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__))
# Find templates in the same folder as settings.py.
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

มันควรจะมองหาไฟล์ต่อไปนี้:

  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html
  • /usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html
  • ...

ไฟล์ทั้งหมดข้างต้นมีอยู่บนดิสก์

แก้ไข

ตอนนี้ทำงานหลังจากที่ฉันลอง:

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

มันแปลก ฉันไม่จำเป็นต้องทำสิ่งนี้บนรีโมตเซิร์ฟเวอร์เพื่อให้ทำงานได้


TEMPLATE_DIRS ของคุณสามารถอ่านได้โดยเว็บเซิร์ฟเวอร์หรือไม่
Jordan Messina

@Jordan, TEMPLATE_DIRS สามารถเข้าถึงได้โดยรูทก็เพียงพอแล้ว มันคือสิ่งที่มันถูกกำหนดค่าบนเซิร์ฟเวอร์ระยะไกลซึ่งใช้งานได้
แจ็ค

คำตอบ:


197

วิธีแก้ปัญหาแรก :

การตั้งค่าเหล่านี้

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

หมายความว่า Django จะดูเทมเพลตจากtemplates/ไดเรกทอรีภายใต้โครงการของคุณ

สมมติว่าโครงการ Django ของคุณตั้งอยู่ตอน/usr/lib/python2.5/site-packages/projectname/นั้นด้วยการตั้งค่าของคุณ django จะมองหาแม่แบบที่อยู่ด้านล่าง/usr/lib/python2.5/site-packages/projectname/templates/

ดังนั้นในกรณีนี้เราต้องการย้ายเทมเพลตของเราให้มีโครงสร้างดังนี้:

/usr/lib/python2.5/site-packages/projectname/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/templates/template3.html

ทางออกที่สอง :

หากยังไม่ได้ผลและสมมติว่าคุณมีแอพที่กำหนดค่าใน settings.py เช่นนี้:

INSTALLED_APPS = (
    'appname1',
    'appname2',
    'appname3',
)

โดยค่าเริ่มต้น Django จะโหลดแม่แบบภายใต้templates/ไดเรกทอรีภายใต้ทุกแอปที่ติดตั้ง ดังนั้นด้วยโครงสร้างไดเรกทอรีของคุณเราต้องการย้ายแม่แบบของเราให้เป็นเช่นนี้:

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html

SETTINGS_PATHอาจไม่ถูกกำหนดโดยค่าเริ่มต้น ในกรณีนี้คุณจะต้องกำหนด (ใน settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

3
@ jpartogi ฉันลองทั้งสองวิธี แต่ไม่ได้ผล ฉันพยายามใช้พา ธ สัมบูรณ์ไปยังเทมเพลตในอาร์กิวเมนต์ render_to_response () แต่ยังใช้งานไม่ได้
แจ็ค

โครงการ django ของคุณอยู่ภายใต้/usr/lib/python2.5/site-packages/projectname/หรือไม่?
โจชัว Partogi

@ jpartogi ใช่แอปที่ติดตั้งทั้งหมดอยู่ภายใต้ /usr/lib/python2.5/site-packages/projectname/appname1, ...
แจ็ค

คุณช่วยแก้ไขโพสต์ต้นฉบับของคุณและวาง settings.py ได้ไหม ไม่รวมการกำหนดค่า DB: -d ขอบคุณ
Joshua Partogi

การวางทุกเทมเพลตจากแอพต่าง ๆ ไว้ในไดเรกทอรีเดียวtemplatesไม่ใช่การออกแบบที่ดี แต่ที่ผมรู้ว่าหลังจากที่เพิ่มของคุณAPP_NAMEในsettings.py, อาจจะไปค้นหาแม่แบบของแอปภายใต้ไดเรกทอรีที่อยู่ภายใต้django APP_DIRดังนั้นคุณสามารถแยกแม่แบบสำหรับแอพต่างๆ (Django 1.7 - .1.9
Alston

59

ค้นหา tuple นี้:

    import os
    SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            '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',
                ],
            },
        },
    ]

คุณต้องเพิ่มสตริง 'DIRS'

"os.path.join(SETTINGS_PATH, 'templates')"

ดังนั้นคุณต้องการ:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(SETTINGS_PATH, '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',
            ],
        },
    },
]

24
SETTINGS_PATHไม่ได้นิยามไว้ที่ใดเลยดังนั้นฉันไม่คิดว่าคำตอบนี้จะใช้ได้ บางทีคุณอาจจะตั้งใจBASE_DIR
เบา ๆ

1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( ไฟล์ ))
Shapon Pal

1
ฉันคิดว่า Shapon Pal หมายถึงSETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))ไม่ใช่ไฟล์
ไมค์

20

หากคุณพบปัญหานี้เมื่อคุณเพิ่มappจากการลบ settingsมันอาจจะเป็นเพราะที่คุณพลาดบางอย่าง appสามขั้นตอนเป็นสิ่งจำเป็นเมื่อมีการเพิ่ม

1、 สร้างไดเรกทอรีและไฟล์เทมเพลต

สมมติว่าคุณมีโครงการที่มีชื่อmysiteและคุณต้องการที่จะเพิ่มชื่อapp your_app_nameวางไฟล์เทมเพลตของคุณmysite/your_app_name/templates/your_app_nameไว้ด้านล่าง

├── mysite
   ├── settings.py
   ├── urls.py
   └── wsgi.py
├── your_app_name
   ├── admin.py
   ├── apps.py
   ├── models.py
   ├── templates
      └── your_app_name
          └── my_index.html
   ├── urls.py
   └── views.py

ที่ 2 เพิ่มของคุณจะappINSTALLED_APPS

ปรับเปลี่ยน settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3 เพิ่มของคุณappไดเรกทอรีไปในDIRSTEMPLATES

settings.pyปรับเปลี่ยน

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉันโดยใช้ django 2.2.7
Jhonatas Kleinkauff

1
ในกรณีของฉันขั้นตอนที่ 2 เท่านั้นที่ขาดหายไป อาร์เรย์ DIRS ที่ฉันสามารถปล่อยว่างไว้และยังใช้งานได้และค้นหาเทมเพลตในไดเรกทอรีเทมเพลตที่ถูกต้องของแอพ
Shri Shinde

13

ในการตั้งค่า. py ลบ TEMPLATE_LOADERS และ TEMPLATE DIRS จากนั้นเพิ่ม

TEMPLATES = [
 {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': ['/home/jay/apijay/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',
        ],
    },
 },
]

5

ฉันมีปัญหาน่าอาย ...

ผมได้รับข้อผิดพลาดนี้เพราะผมวิ่งและลืมที่จะใส่ app INSTALLED_APPSใน คุณคิดว่า Django จะทำให้เกิดข้อผิดพลาดที่สื่อความหมายมากขึ้น


4

เพียงลางสังหรณ์ แต่ตรวจสอบบทความนี้ใน Django แม่แบบโหลด โดยเฉพาะอย่างยิ่งตรวจสอบให้แน่ใจว่าคุณมีdjango.template.loaders.app_directories.Loaderในรายการ TEMPLATE_LOADERS ของคุณ


สิ่งนี้ใช้ได้สำหรับฉัน โหลดเทมเพลตจากแอป Django บนระบบไฟล์ สำหรับแต่ละแอปใน INSTALLED_APPS ตัวโหลดจะค้นหาไดเรกทอรีย่อยของเทมเพลต หากมีไดเร็กทอรีอยู่ Django จะค้นหาเทมเพลตในนั้น <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay

4

ตรวจสอบการอนุญาตสำหรับเทมเพลตและไดเรกทอรี appname โดยใช้ ls -l หรือลองทำเส้นทางที่เปิดอยู่ () จาก django


4

ตอนนี้ทำงานหลังจากฉันลองแล้ว

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

มันแปลก ฉันไม่จำเป็นต้องทำสิ่งนี้บนรีโมตเซิร์ฟเวอร์เพื่อให้ทำงานได้

นอกจากนี้ฉันต้องเรียกใช้คำสั่งต่อไปนี้ในเครื่องท้องถิ่นเพื่อให้ไฟล์คงที่ทั้งหมดสามารถเข้าถึงได้ แต่บนเซิร์ฟเวอร์ระยะไกลพวกเขาทั้งหมด "root: root"

chown -R www-data:www-data /var/www/projectname/*

เครื่องในเครื่องรันบน Ubuntu 8.04 desktop edition เซิร์ฟเวอร์ระยะไกลอยู่ในเซิร์ฟเวอร์รุ่น Ubuntu 9.04

ใครรู้ว่าทำไม


4

สำหรับ django เวอร์ชัน 1.9 ฉันเพิ่ม

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

บรรทัดไปยังบล็อกเทมเพลตใน settings.py และทำงานได้ดี


3

TemplateDoesNotExistข้อผิดพลาดDjango หมายถึงเฟรมเวิร์กไม่สามารถหาไฟล์เทมเพลตได้

ในการใช้ API การโหลดเทมเพลตคุณจะต้องบอกเฟรมเวิร์กว่าคุณเก็บเทมเพลตของคุณไว้ที่ใด สถานที่ที่จะทำเช่นนี้อยู่ในไฟล์การตั้งค่าของคุณ ( settings.py) โดยTEMPLATE_DIRSการตั้งค่า โดยค่าเริ่มต้นมันเป็น tuple ที่ว่างเปล่าดังนั้นการตั้งค่านี้จะบอกกลไกการโหลดเทมเพลตของ Django ที่จะมองหาเทมเพลต

เลือกไดเรกทอรีที่คุณต้องการจัดเก็บแม่แบบของคุณและเพิ่มลงใน TEMPLATE_DIRS เช่น:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)

1

ดูว่า django โฟลเดอร์ใดที่พยายามโหลดเทมเพลตดูTemplate-loader postmortemในหน้าข้อผิดพลาดตัวอย่างเช่นข้อผิดพลาดจะมีลักษณะเช่นนี้:

Template-loader postmortem

Django tried loading these templates, in this order:

Using engine django:
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist)

ในข้อผิดพลาดของฉันvcsrc\vcsrc\templates\base.htmlไม่ได้อยู่ในเส้นทาง
แล้วเปลี่ยนTEMPLATESในsetting.pyไฟล์ไปยังเส้นทางแบบของคุณ

TEMPLATES = [
    {    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
         # 'DIRS': [], 
        'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
        ...


1

ให้แน่ใจว่าคุณได้เพิ่มแอปของคุณไปยังINSTALLED_APPS:project-name/app-namme/settings.py

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

และ แม่แบบ:project-name/app-namme/settings.py

'DIRS': [os.path.join(BASE_DIR, 'templates')],


0

สวัสดีฉันพบวิธีการแก้ปัญหาใหม่ ที่จริงแล้วมันถูกกำหนดไว้ในเทมเพลตอื่นดังนั้นแทนที่จะกำหนด TEMPLATE_DIRS ด้วยตัวเองให้ใส่ชื่อพา ธ ของไดเรกทอรีที่: ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันอายที่จะยอมรับนี้ แต่ปัญหาสำหรับฉันคือการที่แม่แบบที่ได้รับการระบุว่าเป็นแทน….hml ….htmlระวัง!


0

ฉันเพิ่มสิ่งนี้

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)

และมันก็ยังแสดงให้เห็นข้อผิดพลาดจากนั้นฉันก็รู้ว่าในโครงการอื่นแม่แบบกำลังแสดงโดยไม่ต้องเพิ่มรหัสนั้นในไฟล์ settings.py ดังนั้นฉันจึงตรวจสอบโครงการนั้นและฉันก็รู้ว่าฉันไม่ได้สร้างสภาพแวดล้อมเสมือนจริงในโครงการนี้

virtualenv env 

และมันใช้งานได้ไม่รู้ทำไม


0

ฉันมากับปัญหานี้ นี่คือวิธีที่ฉันแก้ไขปัญหานี้:

ดู settings.py ของคุณค้นหาTEMPLATESตัวแปรภายใน TEMPLATES เพิ่มเส้นทางแม่แบบของคุณภายในDIRSรายการ สำหรับผมครั้งแรกที่ผมกำหนดเส้นทางแม่ของฉันเป็นTEMPLATES_PATH = os.path.join(BASE_DIR,'templates')แล้วเพิ่มTEMPLATES_PATHเข้าไปในรายการDIRS 'DIRS':[TEMPLATES_PATH,]จากนั้นรีสตาร์ทเซิร์ฟเวอร์ข้อยกเว้น TemplateDoesNotExist จะหายไป แค่นั้นแหละ.


0

ของคุณในsetting.pyไฟล์แทนที่DIRSในTEMPLATESอาร์เรย์กับเรื่องนี้

'DIRS': []

สำหรับสิ่งนี้

'DIRS': [os.path.join(BASE_DIR, 'templates')],

แต่ 1 คิดว่าคุณจำเป็นต้องรู้คือคุณต้องสร้างโฟลเดอร์ที่มีชื่อtemplates และควรอยู่ในเส้นทางรากมิฉะนั้นคุณจะต้องเปลี่ยนDIRSค่า


0

1. สร้างโฟลเดอร์ 'เทมเพลต' ใน 'แอป' ของคุณ (สมมติว่าคุณตั้งชื่อแอปดังกล่าว) และคุณสามารถวางไฟล์ html ที่นี่ แต่ขอแนะนำอย่างยิ่งให้สร้างโฟลเดอร์ที่มีชื่อเดียวกัน ('แอป') ในโฟลเดอร์ 'เทมเพลต' จากนั้นใส่ html ที่นั่นเท่านั้น ไปที่โฟลเดอร์ 'app / templates / app'

2. ทราบใน URL ของ 'แอป' ใส่:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. ใน views.py ของ 'แอป' ใส่:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.