2017-08-10 121 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