I'm trying to use jinja2 in my Django project (ver 1.10). After setting it up, once I try to run the project, I get TemplateDoesNotExist at /base/index.html and
Template-loader postmortem
Django tried loading these templates, in this order:
Using engine jinja2:
This engine did not provide a list of tried templates.
In templates folder, I have a base directory where index.html is placed. Moreover, if I use Django's template engine, this same folder structure works perfectly. How can I fix this issue?
My config is as follows:
In settings.py (note that I've deliberately excluded the Django template fallback):
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {'environment': 'uberfordoc.jinja2.environment',
},
},
]
I also have a file called jinja2.py kept in the project folder:
from __future__ import absolute_import
from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse
from jinja2 import Environment
def environment(**options):
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
return env
This was my BASE_DIR and MAIN_DIR in settings.py
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
MAIN_DIR = os.path.dirname(os.path.dirname(__file__))
and my jinja2 templates were at the path
/Users/username/Desktop/uberfordoc/templates/jinja2
changed
'DIRS': [os.path.join(BASE_DIR, 'templates')],
to
'DIRS': [os.path.join(MAIN_DIR, 'templates/jinja2')],
and it worked. Got the hint thanks to #Timbadu by printing
print os.path.join(BASE_DIR, 'templates')
Related
I am creating a website using Django 2.0.7. I need to use a base template that is outside the purview of all applications, but can be inherited and used by templates in my other applications in the project.
I have edited my settings.py file appropriately (as per the documentation), but still when I go the root (i.e. home) page of my site, I get a blank page - can anyone explain why?
I have the following directory structure
myproj
----manage.py
----app1
----templates/
base.html
index.html
----static/
----myproj
__initi__.py
wsgi.py
settings.py
urls.py
views.py # <- I added this
The relevant parts of my settings.ini file looks like this:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['{0}/templates/'.format(BASE_DIR),],
'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',
],
},
},
]
views.py:
from django.http import HttpResponse
def index(request):
return HttpResponse()
Why can't django find my index.html ?
Use 'DIRS': [os.path.join(BASE_DIR, "templates")] in your settings, and your view should return a object which knows what template to render, like this one:
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
There's also TemplateResponse(), SimpleTemplateResponse() and other objects you can return, depending on your needs.
Software versions:
Python: 3.5.2
Django: 1.10
I'm trying to deploy a django project onto a Dreamhost site, but whenever I try to extend my base templates it gives me a Server Error 500. My view renders just fine until I include the {% extends 'base.html' %} to the template that the view is trying to render.
What is frustrating is that with the exact same files, the local development version works fine (i.e. using python manage.py runserver).
Here is my project outline:
<website.com>
├─passenger_wsgi.py
└─simplistic
└──simplistic
| ├─__init__.py
| ├─settings.py
| ├─urls.py
| └─wsgi.py
├──main
| ├─__init__.py
| ├─urls.py
| ├─views.py
| └─templates
| └─main
| └─main.html
├──templates
| └─base.html
└──manage.py
Here is my passenger_wsgi.py file:
import sys, os
cwd = os.getcwd()
sys.path.append(cwd)
INTERP = "/home/<my_user_name>/.virtualenvs/simplistic_production/bin/python"
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
sys.path.append('/home/<my_user_name>/<my_website>.com/simplistic')
os.environ['DJANGO_SETTINGS_MODULE']="simplistic.settings"
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Here is the relevant part of my settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [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',
],
},
},
]
I have also tried changing the Templates = [ 'DIRS':] entry to
/home/<username>/<website>.com/simplistic/templates
This doesn't work either.
The fact that the manage.py runserver version works while the production environment doesn't leads me to believe that there may be a problem with my passenger_wsgi.py file, but if I change any of those paths it breaks everything (i.e. I can't even access main.html with {% extends 'base.html' %} turned off).
I'm at a complete loss here. I would appreciate any help. Thanks!
Your DIRS setting looks wrong. You want to combine BASE_DIR and 'templates'.
'DIRS': [os.path.join(BASE_DIR, 'templates')],
I have tried my best to source and to fix this problem, but I can't seem to find the answer.
Currently going through the tangowithdjango tutorial, I'm currently on 5. Templates and Static Media.
http://www.tangowithdjango.com/book17/chapters/templates_static.html
Trying to get my site to show its first template, but just before I reach 5.2 I tried loading my site and got this error message:
TemplateDoesNotExist at /rango/
rango/index.html
Request Method: GET
Request URL: http://127.0.0.1:8000/rango/
Django Version: 1.8
Exception Type: TemplateDoesNotExist
Exception Value:rango/index.html
Exception Location: /Library/Frameworks/Python.framework/Versions/2.7/lib
/python2.7/site-packages/django/template/loader.py in get_template, line 46
Python Executable: /Library/Frameworks/Python.framework/Versions/2.7
/Resources/Python.app/Contents/MacOS/Python
Python Version: 2.7.9
Here is my settings.py file:
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_PATH = os.path.join(BASE_DIR, 'templates')
# Template from tangowithdjango 5.1: Templates and Static Media
#
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
TEMPLATE_PATH,
)
Here is my views.py:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
# Construct a dictionary to pass to the template engine as its context.
# Note the key boldmessage is the same as {{ boldmessage }} in the template!
context_dict = {'boldmessage': "I am bold font from the context"}
# Return a rendered response to send to the client.
# We make use of the shortcut function to make our lives easier.
# Note that the first parameter is the template we wish to use.
return render(request, 'rango/index.html', context_dict)
Sorry about the comments, after a few tries I copied the site's code, but still to no success.
My file structure is as follows:
workspace
tango_with_django_project
manage.py
tango_with_django_project
settings.py
templates
rango
index.html
To add, here is what is shown at 127.0.0.1:8000/rango :
Template-loader postmortem
Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
Using loader django.template.loaders.app_directories.Loader:
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
/site-packages/django/contrib/admin/templates/rango/index.html (File does not exist)
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
/site-packages/django/contrib/auth/templates/rango/index.html (File does not exist)
TEMPLATE_DIRS is deprecated in django 1.8. You should use the TEMPLATES setting instead. Chances are that you already have the TEMPLATES variable in the settings.py so alter the DIRS key like this:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [TEMPLATE_PATH], # <-- HERE --
'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 = os.path.dirname(os.path.dirname(__file__))
Add this below BASE_DIR:
PROJECT_PATH = os.path.join(BASE_DIR, os.pardir)
Next following should look like this:
STATIC_PATH = os.path.join(PROJECT_PATH, 'tango_with_django_project/static')
STATIC_URL = '/static/'
STATICFILES_DIRS =(
STATIC_PATH,
)
TEMPLATE_PATH = os.path.join(PROJECT_PATH, 'tango_with_django_project/templates')
TEMPLATE_DIRS = (
TEMPLATE_PATH,
)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'tango_with_django_project/media')
Your directory structure is wrong. check out what this code is doing...
directory = os.path.dirname(os.path.abspath(__file__))
according to your directory structure this code returns...
/root_path/tango_with_django_project/tango_with_django_project
therefore according to your structure, templates folder is not inside the folder tango_with_django_project which is where it thinks it should be.
you could just specify a direct path to your templates if you want.
TEMPLATE_PATH = '/root_project/tango_with_django_project/templates/'
On a side note, Tango with Django is the worst name for a tutorial series, possibly ever.
I am reading http://www.djangobook.com/en/2.0/chapter04.html which follows Django 1.4 but I use Django 1.6 so how to set the template directory in Django 1.6 as settings.py doesn’t have TEMPLATE_DIRS variable and why the developers changed this?
Thanks in advance.
Add to settings.py
from os.path import join
TEMPLATE_DIRS = (
join(BASE_DIR, 'templates'),
)
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
)
Add this to settings.py. In django 1.6 BASE_DIR is defined. Otherwise define BASE_DIR as
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
According to Django tutorial, you should add
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
to your settings.py file (so it is a list not a tuple)
It should be
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
)
Or you might see an error like this :
DeprecationWarning: The TEMPLATE_DIRS setting must be a tuple. Please
fix your settings, as auto-correction is now deprecated.
self._wrapped = Settings(settings_module)
For django >= 1.6 it is a tuple
Use the below given code snippet. Paste it in last of the settings.py file.
from os.path import join
TEMPLATE_DIRS = (
join(BASE_DIR, 'templates'),
)
Here BASE_DIR means your project directory, not the inner directory where the settings.py resides. Create a directory named "templates" (without quotes) inside the BASE_DIR and store your templates inside that directory. Django will join templates directory to the BASE_DIR using os.path.join() function. Hope this helps.
As I posted https://stackoverflow.com/a/40145444/6333418 you have to add it to the DIR list that is inside settings.py under TEMPLATES.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['[project name]/templates'], # Replace with your project name
'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',
],
},
},
]
I am new to Django. I use pydev eclipse as an IDE. First I created a project then an application welcome on that project. I made a folder named Templates within the project and make a file "home.html" and home.html contains
<div>
This is my first site
</div>
I modify the settings.py file as
TEMPLATE_DIRS = ("Templates")
INSTALLED_APPS = (
..........#all default items
'welcome', #the added one
)
views.py includes
from django.shortcuts import render_to_response
def home(request):
return render_to_response('home.html')
urls.py contains
from django.conf.urls import patterns, include, url
from welcome.views import home
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'MajorProject.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^home/$', home),
)
then I run it as django project and open my browser and see on localhost:8000/home
it shows error
TemplateDoesNotExist at /home/
home.html
Request Method: GET
Request URL: http://localhost:8000/home/
Django Version: 1.6
Exception Type: TemplateDoesNotExist
Exception Value:
home.html
Exception Location: C:\Python27\django\template\loader.py in find_template, line 131
Python Executable: C:\Python27\python.exe
Python Version: 2.7.2
Python Path:
['D:\\Bishnu\\BE\\4th year\\8th semester\\Major Project II\\Working\\Workspace\\MajorProject',
'C:\\Python27\\lib\\site-packages\\distribute-0.6.35-py2.7.egg',
'D:\\Bishnu\\BE\\4th year\\8th semester\\Major Project II\\Working\\Workspace\\MajorProject',
'C:\\Python27\\DLLs',
'C:\\Python27\\lib',
'C:\\Python27\\lib\\plat-win',
'C:\\Python27\\lib\\lib-tk',
'C:\\Python27',
'C:\\Python27\\lib\\site-packages',
'C:\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode',
'C:\\Windows\\SYSTEM32\\python27.zip']
Server time: Sun, 2 Jun 2013 14:25:52 +0545
Try to set Templates Directory on setting.py.
as
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__),'templates'),
)
If you're using Django 1.8+
You'll get this warning:
(1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dictionary takes precedence. You must put the values of the following settings into your default TEMPLATES dict: TEMPLATE_DIRS, TEMPLATE_DEBUG.
Add your template directory to the Base TEMPLATES setting under the DIRS dictionary
Like so:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
root("templates"), #### Here ####
],
'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',
],
},
},
]
in Django 1.9
in settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR+r'\templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
...
],
},
},
]
Directory with templates should be named templates, not Templates (even though on windows it may be the same). Also make sure, you have application in PYTHONPATH or the correct directory structure of your project and application like:
project/
project/
settings.py
...
welcome/
templates/
home.html
views.py
...
manage.py
Then you don't need to change TEMPLATE_DIRS because app_directories.Loader (enabled by default) will find the templates in your application.
Also of if you still want to change TEMPLATE_DIRS, use absolute paths, but preferred way is the app_directories.Loader.
check below steps to fix
step 1:
Inside templates, 'DIRS' : [ ], metion this:
'DIRS': [os.path.join(BASE_DIR, 'templates')],
step 2:
Go in your views.py file and look for template_name (check its spelling and also check did you mentioned the right html file here or not)
step 3:
Check in your urls.py file wether you mentioned the right template name or not in the path
format: urlpatterns = [ path(" ", class name or function name, name = template name)
BASE_DIR = Path(file).resolve().parent.parent
This is default directory code by Django
And looks like this
C:\user\pc_name\django_project
But if you delete last .parent it will looks like this
C:\user\pc_name\django_project\django_project
So new BASE_DIR code which is this
BASE_DIR = Path(file).resolve().parent
Add this variable to TEMPLATE_DIR
TEMPLATE_DIR = os.path.join(BASE_DIR, 'template")
And last code define this
C:\user\pc_name\django_project\django_project\template
In the end safely uptade DIRS
'DIRS': 'TEMPLATE_DIR'
Hope you did