Custom allauth template with Django 1.8 - django

I read many different setup for getting allauth working with django in general, and 1.8 specifically but none is working.
here is my current setup with allauth 0.29:
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' : {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
With all Allauth accounts templates in
basedir/templates/allauth/accounts
Altough all allauth template pickup the site's base template, any modification to the template in tis directory are royally ignored. if you have this working with django 1.8 please describe your setup.

To override templates you must put a folder with the name of the app inside of your templates folder. In your case you want something like:
templates/account

It turns out that you can only override templates in a django APP template dir. Not the main template dir, even if properly configured.
And that app must be loaded before all the allauth app in your settings.py .
That's weird since the allauth templates are supposed to affect site wide authentication process, not just a specific app in a project.
I ended up create an app "allauthapp" specifically for overriding templates.

Related

Django context processor constants work in dev but not in production

I have a context processor which makes constants available in templates, including base template.
On my vagrant development server, using runserver, these work fine. The production server uses apache and WSGI.
I'm using Django 1.9.4 on both development and production.
This is the context_processors.py
from .constants import *
def template_constants(request):
return {'collection_name': COLLECTION_NAME,
'website_name': WEBSITE_NAME,}
This is from settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.template.context_processors.request',
'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',
'myapp.photos.context_processors.template_constants',
],
},
},
]
Constants are just in a file constants.py in my app, which I import into files which use them. The file has lines such as:
WEBSITE_NAME = "website name"
My views use render which should be including RequestContext
return render(request, 'page.html', template_variables)
I get no error messages, the variables simply don't have a value in the templates on production, so nothing is shown.
Apart from deployment, the code on production and dev is exactly the same.
Things I've tried:
- Adding string value directly into context_processors.py file (eliminating it being a potential issue importing variables from constants.py)
- Going back to Django 1.8 and 1.7 to check if it's something related to a specific version
None of these changes made any difference.

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.

Django: Template search order for the authentication system (to create my own auth templates)

I am using the default authentication system of Django (v1.8.12), but I want to create my own templates (actually according to the documentation django.contrib.auth do not provide any template).
Then I added the folder 'registration' inside the 'templates' folder of my application 'mainApp'. According to the documentation this is the right place, a folder named 'registration'.
I have also created the template 'login.html', and this template is loaded properly at the defined url '...account/login'.
The problem is with the other templates:
logged_out.html
password_change_done.html
password_change_form.html
password_reset_complete.html
password_reset_confirm.html
password_reset_done.html
password_reset_email.html
password_reset_form.html
The previous templates are been loaded from the 'admin' application and not from my app.
How can I tell Django that my 'registration' templates should be loaded and not the templates defined in the admin application?
My project url.py is
urlpatterns = [
url(r'^', include('mainApp.urls', namespace="mainApp")),
url(r'^admin/', include(admin.site.urls)),
url(r'^account/', include('django.contrib.auth.urls')),
]
My template settings are the default settings
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'debug': True,
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
Just move mainApp above django.contrib.admin in your INSTALLED_APPS setting, so that Django searches the mainApp/templates directory first.
That way, you don't need to add mainApp/templates to your DIRS setting.

Why didn't this code in settings.py override the default Django project template?

I'm going through the very basic tutorial here and I am using my own base_site.html template instead of the default one, which has a different header text.
I copied the default template into my template folder, modified it, then linked the new template in settings.py:
BASE_DIR = os.path.dirname(os.path.dirname(__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',
],
},
},
]
No dice.
When I went a much simpler route and instead simply linked it with the single line below, it worked easily:
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates/')]
Which is great! But now I want to know why the original code doesn't work.
If it helps, my folder structure is:
- Scripts
- mysite
- mysite
- polls
- templates
- admin
base_site.html
The TEMPLATES setting will be introduced in the django 1.8. It is unavailable in the current django 1.7.
So read the tutorial for the actual version of django you using.

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