django override admin template - django

I am following part 2 of the Django tutorial. I am trying to override an admin template (base_site.html)
I copied the file from the django/contrib/admin/templates to mytemplates/admin/base_site.html
I also updated settings.py:
#Base Directory
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
#Template directories
TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'mytemplates'),)
I tried putting the mytemplates folder in the root of the project folder as well as in the mysite folder with no luck. Any pointers would be great!

EDITED PREVIOUS USER RESPONSE -- THIS WORKS:
I think your relative path to the templates directory is wrong.
If you follow these steps it should work: (I tested it myself)
Put the mytemplates dir side by side with the manage.py file
project
-app1
-app2
-mytemplates
-admin
-base_site.html
-manage.py
Change the TEMPLATE_DIRS to:
TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'mytemplates'),)
Make sure the order of the template loader is:
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)

#YardenST's answer almost worked for me. I guess it's a matter of configuration.
In case you run into trouble, I suggest you use this line:
TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'mytemplates'),)
Next, put a breakpoint to show the actual outcome, or alternatively use print TEMPLATE_DIRS.
That's where you should place the templates you want to override.

#kat-russo, thx ;)
I tried to setup admin templates according to docs
project_name
-app1
-app2
-project_name //main folder -> settings.py , urls.py, wsgi.py
-templates
-admin
-project_name
base.html
without success, but
-templates
-admin
base.html
works for me.
my config (Django 1.10.4 w/Django CMS 3.4.1)
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',
'sekizai.context_processors.sekizai',
'cms.context_processors.cms_settings',
],
},
},
]

You can override all templates.
Create an admin directory in templates and add the files.
The all files.
https://github.com/django/django/tree/master/django/contrib/admin/templates/admin

Related

How to change admin templates directory folder

I set an address for the DIRS in TEMPLATES setting in my project's settings.py file and also i change APP_DIRS to False.
now, all of the templates will running but when i go to localhost:8000/admin, it generates an error that said "Template Does Note Exists".
TemplateDoesNotExist at /admin/
admin/index.html
i dont want to APP_DIRS be True.
how can i solve this problem?
this is the settings
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
],
'APP_DIRS': False,
'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',
],
},
},
]
If you dont want APPS_DIR to be TRUE, copy templates of admin app to your template directory. When you set APP_DIR to True django will check for a directory named templates in each apps and if found load specified templates from that directory. Else django will check for a directory with same name as of app in the global template directory if found render specified template.
In you case APP_DIR is set to False and there is no directory named as admin in global template folder. So copy template directory from django/contrib/admin/ of your virtual environment and place it in your global template directory. I suppose your global template directory is in the project directory itself.
os.path.join(BASE_DIR, 'templates'),
HTH :)

How to edit django-allauth default templates?

i'm using Django 1.10 and i want to add the allauth's app for login, signin, etc, to my website. I've installed allauth from pip, and tried to put the templates from allauth repository inside my templates folder and call them but i don't know how to make it work.
The correct answer can be found here: https://stackoverflow.com/a/31282443/4992248
Create yourproject/templates/allauth/account/ and paste here all templates you need to edit from /myproject/Lib/site-packages/allauth/templates/account.
If you need to make changes for socialaccount templates, create also yourproject/templates/allauth/socialaccount/
Edit 'DIRS' in settings.py like 'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'allauth')],
In the end it should look somethink like this:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'allauth')],
'APP_DIRS': True,
'OPTIONS': {
'debug': False,
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.template.context_processors.media',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
You never should do any code changes at /Lib/site-packages/*, because all changes are lost once a package is updated.
This worked for me using Django 2.1.7 and django-allauth 0.39.1:
In the folder yourapp/templates/ create a folder named account so at the end the structure is yourapp/templates/account/ and add all templates that you want to override like login.html or signup.html.
In settings.py my Template Dirs remain the same
'DIRS': [os.path.join(BASE_DIR, 'templates')],
It seems that the documentation of the module is out of date. For Django 1.10 you should do the following:
download the module with pip
add the following to INSTALLED_APPS(/settings.py file)
'django.contrib.sites', # first place
'allauth', # after your modules declarations
'allauth.account',
'allauth.socialaccount',
add the backends declarations and another stuff needed by allauth
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
SITE_ID = 1
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_USERNAME_REQUIRED = True
seems that for django 1.10 is not needed to modify TEMPLATES section (django-allauth==0.28.0). You can verify the modules versions using the "pip freeze" command.
create an artificial module to override the templates; for example, my project is named irj_app and I've add a new application called _shared, then i have the following structure, and add it to INSTALLED_APPS before 'allauth' declarations :
irj_app / _shared
i've created a templates directory inside "_shared" folder and i've added a file called "base.html" that overrides the allauth template. what i'd found is that django-allauth creates a template that overrides the layout that you've made before, then you need to intercept the django-allauth templates to change this behavior. Also you can override any template of this authentication mechanism. For example i have:
irj_app / _shared / templates / base.html
irj_app / _shared / templates / account / base.html
irj_app / _shared / templates / account / signup.html
irj_app / _shared / templates / _shared / adminlte-template / ... (template for other modules)
hope it helps
Try This:
Create account directory in your app's template dir so that it looks like below
yourppname/templates/account
and files
yourppname/templates/account/login.html
yourppname/templates/account/signup.html
and add below to your TEMPLATE DIRS Remember to change yourappname to your app's name
os.path.join(BASE_DIR, 'yourappname', 'templates')
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'yourappname', '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',
],
},
},
]
Like many have already told here, all we have to do is bring the account,openid and socialaccount folders from the templates folder of allauth into the templates folder of our project folder.
But one thing to keep in mind while adding the
'DIRS': [os.path.join(BASE_DIR, 'project_name','templates')]
to the setting is that, the BASE_DIR in django points to the directory where manage.py is stored. And it is at this level we have our project folder and our templates folder within the project. So we need to add our 'project_name' and then 'templates' to the DIRS with os.path.join
I use django 3.0.4 with django-allauth 0.41.0
Add folder templates in your project directory.
Inside the folder templates add another folder with the app_name, in the case of the template login.html you'll create a folder accounts
so the full path will be
/project_name/templates/accounts/login.html
my TEMPLATE Dirs in settings.py remain the same
'DIRS': [os.path.join(BASE_DIR, 'templates')]
django-allauth doc templates
Allauth templates can be overridden just like the normal template overriding methods.
Set template directory
TEMPLATE_DIRS = (
os.path.join(BASE_DIR,'templates'), os.path.join(BASE_DIR,'templates'))
Your template directory will be in project directory. Go inside your template directory and create a directory named allauth, inside allauth create a template directory and inside that create a directory accounts
Create html files with same name as allauth templates. Refer to allauth github repository for more info on template names.
In django-allauth==0.36.0
let's say you wanna customize the login page.
don't need to change TEMPLATES setting
just create a folder named account in your project templates folder then:
clone the project
git clone https://github.com/pennersr/django-allauth
cd django-allauth/allauth/templates/account
Copy base.html and login.html to the created account folder
I tried, it works.
Official Link
Well, i was just able to do it.
I didn't know where these templates were but i found that, in my case (i'm using virtual env):
Envs/myproject/Lib/site-packages/allauth/templates
i modified the base.html and added my static folder with all my bootstrap stuff and jquery to the settings in the file:
app_settings.py
and added this.
...
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
And that's all.
I don't know if this is the propper way to do it but if someone have a better answer please post it.

Base template for all apps in Django

I have a project with 2 apps
project/
blog/
templates/
index.html
polls/
templates/
index.html
project/
templates/
base.html
index.html
Now i want that the two apps extends the projects base.html. Is this the way to go? how it is possible and are there better solutions?
There is already an question which is handling this question, but it's only worth mentioning if you dont use split directories:
Django project base template
tl;dr: I want to use split directories and want to know how to extend a base template from multiple apps without copying it to every app
In current Django (1.10) TEMPLATE_DIRS is deprecated, so:
Add a templates directory at the project root,
In settings.py find TEMPLATES -> DIRS and add it like this:
TEMPLATES = [
{
...
'DIRS': [(os.path.join(BASE_DIR, 'templates')),],
...
}
Add a base.html to that directory.
Extend it wherever you want using {% extends 'base.html' %}
Add a templates directory at the project root, and add it to your TEMPLATE_DIRS setting.
Add a base.html to that directory.
Extend it wherever you want using {% extends 'base.html' %}
For Django versions above 1.8 the upgrade doc suggests the vanilla settings (for most non-advanced django tangoers like me) be added to your settings.py:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [(os.path.join(BASE_DIR, 'my_Templates_Directory')),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
# Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this
# list if you haven't customized them:
'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',
],
},
},
]
Both BACKEND and OPTIONS were required, otherwise I had errors relating to 'INVALID BACKEND' and 'django.contrib.auth.context_processors.auth' must be in TEMPLATES'.

TEMPLATE_DIRS is missing in settings.py (django 1.6)

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',
],
},
},
]

Django Template Error :TemplateDoesNotExist at / homepage/index.html

I'm attempting to get the Django development server to load a template with the following settings but it's throwing the error
TemplateDoesNotExist at /
homepage/index.html
Below are the files that I've edited to try to get this to work
blog/blog/settings.py - (Cut the portion pertaining to this question)
import os
TEMPLATE_DIRS = (
os.path.join( os.path.dirname(__file__), 'templates' ),
)
blog/apps/homepage/views.py
from django.shortcuts import render_to_response
def index(request):
return render_to_response('homepage/index.html')
Any thoughts about how to fix this?
By default Django uses two template loaders to locate templates:
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
First the filesystem loader checks all dirs in TEMPLATE_DIRS to see if it can find the named template. If that fails the app_directories loader will look in the /templates/ dir in the current app for the named template. This way you can ship default templates with reusable apps that can easily be overridden.
In your case Django will look for the template here:
blog/blog/templates/homepage/index.html
blog/apps/homepage/templates/homepage/index.html
You give a wrong direction to your TEMPLATE_DIRS. The settings.py file is in package blog in project blog, but your templates folder is in blog project, not in blog package. You must give the absolute directory of your project and join templates with it.
in django 1.10, navigate to path/to/settings.py in your parent project directory, look for:
TEMPLATES = [.....] and specify the path/to/project_directory in the DIR: option
for example (in my own case):
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'/xampp/htdocs/advisory_portal'
],
'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',
],
},
},
]