2017-08-10 120 views
1

我想在django中加載模板。我創建一個文本文件名爲current_date.html和類型文件Django TemplateDoesNotExist和BASE_DIRS

"It is now {{current_date}}." 

內,把它放在模板目錄內

C:\Users\reza\env_mysite\lib\site-packages\django\contrib\admin\templates 

然後我寫了下面的代碼塊中的視圖中:

from django.template.loader import get_template 
from django.template import Context 
from django.http import HttpResponse, Http404 
import datetime 

def current_datetime(request): 
    now = datetime.datetime.now() 
    t = get_template('current_datetime.html') 
    html = t.render(Context({'current_date':now})) 
    return HttpResponse(html) 

和內部urlpatterns我輸入:

url(r'^time/$', current_datetime) 

在settings.py文件,裏面DIRS鍵入:

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

下回我輸入

'DIRS': ['C:\Users\reza\env_mysite\lib\site- 
packages\django\contrib\admin\templates'] 

但在這兩種情況下,我收到TemplateDoesNotExist錯誤下面詳細介紹

Request Method: GET 
Request URL: http://127.0.0.1:8000/time/ 

Django Version: 1.11.2 
Python Version: 3.6.1 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 

Template loader postmortem 
Django tried loading these templates, in this order: 

Using engine django: 
    * django.template.loaders.filesystem.Loader: C:\Users\reza\templates\current_datetime.html (Source does not exist) 
    * django.template.loaders.app_directories.Loader: C:\Users\reza\env_mysite\lib\site-packages\django\contrib\admin\templates\current_datetime.html (Source does not exist) 
    * django.template.loaders.app_directories.Loader: C:\Users\reza\env_mysite\lib\site-packages\django\contrib\auth\templates\current_datetime.html (Source does not exist) 

請讓我知道我的代碼有什麼問題

回答

2

你絕對不應該在Django的任何目錄中放置自己的模板。你的代碼應該完全分開。

您應該在您的項目中創建自己的templates目錄並將您的模板放在那裏;那麼你的第一次嘗試,os.path.join(BASE_DIR,'templates'),將工作。

+0

哪一個是項目目錄env_mysite或mysite?我有兩個文件夾 – reza

+0

你的代碼的其餘部分在哪裏? –

+0

網址,設置和視圖在mysite和include,lib,腳本在env_mysite – reza

0

其他錯誤如下:

Traceback: 

File "C:\Users\reza\env_mysite\lib\site-packages\django\core\handlers\exception.py" in inner 
    41.    response = get_response(request) 

File "C:\Users\reza\env_mysite\lib\site-packages\django\core\handlers\base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "C:\Users\reza\env_mysite\lib\site-packages\django\core\handlers\base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "C:\Users\reza\mysite\views.py" in current_datetime 
    11.  t = get_template('current_datetime.html') 

File "C:\Users\reza\env_mysite\lib\site-packages\django\template\loader.py" in get_template 
    25.  raise TemplateDoesNotExist(template_name, chain=chain) 

Exception Type: TemplateDoesNotExist at /time/ 
Exception Value: current_datetime.html 
0

你說,你放在這個新的模板,current_date.htmlC:\Users\reza\env_mysite\lib\site-packages\django\contrib\admin\templates目錄。這是Django包的一部分,應該包含兩個目錄admin/registration/。是否有可能將您的新模板置於之內的那些內部文件夾之一,如admin/文件夾?

如果是這樣,那麼你應該在你的視圖更新呼叫get_template(),使它看起來像這樣:

def current_datetime(request): 
    now = datetime.datetime.now() 
    t = get_template('admin/current_datetime.html') # note updated path 
    html = t.render(Context({'current_date':now})) 
    return HttpResponse(html) 

請注意,你不符合這裏的最佳實踐,但是這是一個單獨的問題真的。一些建議是將這個新模板轉移到您自己的應用程序的templates/目錄中(對已安裝的軟件包進行修改通常不是一個好主意),您還應該使用django.shortcuts.render,這樣可以減少必須編寫/管理:

from django.shortcuts import render 

def current_datetime(request): 
    now = datetime.datetime.now() 
    return render(request, 'admin/current_datetime.html', {'current_date':now}) 
+0

我把它放在模板裏面而不是管理員或註冊。在文件內部,我還輸入了它現在是{{current_date}}。沒有雙引號 – reza

+0

我用記事本的文本文件。那很好嗎? – reza

+0

如果將該模板路徑設置爲絕對存在的文件(如「admin/base.html」),會發生什麼情況? (notepade應該沒問題) – YellowShark