I have followed the instructions on using jinja2 with django1.8. --->
#settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
normpath(join(DJANGO_ROOT, 'templates/jinja2')),
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'kuyuweb_dj_1_8.jinja2.environment',
},
},
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.debug',
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.request',
],
},
},
]
I have a .py file including environment -->
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
and in my application folder i have templates/jinja2 folder.
I have created a simple view as:
def home(request):
works = Work.objects.filter(publish=True).order_by('-created_at')[:8]
return render(request, 'jinja2/home.html', {'works':works })
But for example when i try to use jinja2 template tag as {{ loop.index }} it does not work. {{ forloop.counter }} is still working.
Is there something that i miss?
The jinja templates for your app should be in yourapp/jinja2, not yourapp/templates/jinja2.
If the template is at yourapp/jinja2/home.html, then your render line should be
return render(request, 'home.html', {'works':works })
Related
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('',views.home, name='home')
]
another urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('subokLang.urls')),
path('admin/', admin.site.urls),
]
settings.py - templates
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'tryingDjango/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',
],
},
},
views.py
from django.shortcuts import render
from django.http import HttpResponse
def home(request):
return render(request, 'templates/home.html')
I am stuck here, tried changing many already, still won't work, the 500(Template does not exist), what is the right code?
In your settings.py file:
inside TEMPLATES, just add this:
[os.path.join(BASE_DIR, 'templates')]
Ex:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], #Added 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',
]
},
},
]
I get a mistake when tying to add templates to my Django project.
settings.py :
TEMPLATE_DIRS = (
os.path.join(os.path.dirname(__file__), 'templates'),
)
views.py:
def index(request):
a = models.User.objects.get()
return render(request, "main/list.html", {"list": a})
and list.html:
{% extends "base.html" %}
{% block title %}Chats{% endblock %}
{% block content %}
{% if list%}
{% for i in list%}
<h2>{{i.usrname}}</h2>
{% endif %}
The project folder itself looks like this:
Main folder is app.
Thanks for your help!
You should include the os.path.join(...) in the Template 'DIRS'
Example:
In settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
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',
],
},
},
]
Then in your folder structure, you should have
app_name (main app folder) --> templates --> app_name(again) --> templates go here.
EDIT: I forgot to mention that in order to do this you must import os
treid change TEMPLATE_DIRS completly with this
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',
],
},
},
]
I already saw all the links on stackoverflow related to this.
I am using Django 1.9.7 an I try to see in template if theuser is authenticated but I can't get the user.
Template code which is not printing anything:
{{ user.is_authenticate }}
{{ request.user.is_authenticate }}
Settings code:
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',
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
],
},
},
]
I already tried withou social.apps and still not working, any ideas?
Make sure you pass the request context in the view, it's what adds the user to the context...
from django.template import RequestContext
def some_view(request):
form = None
# request.user accesses user here
return render_to_response('some_template.html', {'form':form}, context_instance=RequestContext(request))
Now in the template you can use:
{% if request.user.is_authenticated %}{{ request.user.email }}{% endif %}
I'm using linux, python 3.4, django 1.8.2, pytmysql
In my virtualenv there are:
db.sqlite3 manage.py new/ templates/
settings.py:
First I commented 'DIRS':[],
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',
],
},
},
]
then add this part:
TEMPLATE_DIRS = (
'/home/niloofar/django/niloofar/new/templates',
)
urls.py:
from new.views import welcome
urlpatterns = [
url(r'^welcome', welcome),
]
views.py:
from django.shortcuts import render
def welcome(request):
message = "welcome again:D"
return render(request, 'base.html', {'message': message})
In templates directory, there is base.html file:
<html>
<body>
<p>* {{ message }} *</p>
</body>
</html>
When I refresh the page it prints error:
Exception Type: TemplateDoesNotExist
Exception Value: base.html
Try this, don't need to comment DIRS.
The setting TEMPLATE_DIRS is deprecated. see the link https://docs.djangoproject.com/en/1.9/ref/settings/#template-dirs
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(os.path.dirname(__file__), '..//', 'templates').replace('\\', '/')],
'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 am using Django 1.8.6 with Python 2.7. I am trying to use a base.html template that can be used globaly through out the entire site, where every app and access it. Here is my test site's current structure:
twms
polls
migrations
static
templates
project
migrations
static
templates
project
index.html
tmws
static
templates
tmws
base.html
Here is the code for project/templates/project/index.html
{% extends 'tmws/base.html' %}
{% block content %}
<h1>Projects</h1>
<ul>
{% for project in project_list %}
<li>{{ project.name }}</li>
{% endfor %}
</ul>
end of list
{% endblock %}
This is the error I am receiving:
TemplateDoesNotExist at /project/
tmws/base.html
How do I access tmws/tmws/templates/tmws/base.html from any of my apps?
Any help would be greatly appreciated!
Let me know if any additional information is needed.
EDIT
Here are my template settings from settings.py:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'), # If i leave both or just comment one one out I still get the same error
'tmws.tmws.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 think you might be having a problem with your template directory configuration. In your project´s settings.py try to check if you have a configuration similar to this one:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'your template dir 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',
],
},
},
]
Where 'your template dir name' should be tmws. This will make django search for this directory whenever you try to extend templates in your HTML. You can add as many directories as you want.
I think right now Django must be searching for the template in:
twms/project/templates/project
So maybe if you place your base.html file there Django will be able to find it.
Another suggestion would be to create a general templates directory and place your base.html there since you want it to be used in the entire site. This is just my taste for ordering templates, but it should work either way.
Edit:
Adding the following in settings.py solved the problem. Read comments for more info:
MASTER_BASE_DIR = os.path.dirname(__file__)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(MASTER_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',
],
},
},
]
Check the TEMPLATES value in your settings. You can add the DIR option with a directory where you can put all your common templates.
Link: https://docs.djangoproject.com/en/1.9/ref/settings/#templates
You need to add all templates folders to the TEMPLATES settings in settings.py. Django will then treat them as if they're all in the same folder. It seems like you have not added all of them. You want your TEMPLATES to look something like this:
TEMPLATES = [
{
'DIRS': [
'twms.tmws.templates', # Since this is not in an app
],
'APP_DIRS': True, # Automatically include the templates from INSTALLED_APPS
},
]
You set up the directories to search for the templates as follows:
'DIRS': [os.path.join(MASTER_BASE_DIR, 'templates'),]
where it should read instead:
'DIRS': [os.path.join(MASTER_BASE_DIR, 'tmws/templates'),]
Why? because BASE_DIR is defined as follows:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# -> os.path.dirname(os.path.dirname(/your/path/tmws/tmws/settings.py))
# -> /your/path/tmws/
So BASE_DIR points to your top folder, if you then join it with 'templates', it becomes: /your/path/tmws/templates, which doesn't exist. However, with the changed line in the DIRS list, it will become /your/path/tmws/tmws/templates which is the correct one.