Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django - static files in base template

How to make base template use static files and to make other templates that inherits base template to use same static files?

As I read in django documentation it writes about how to use static files that are used for specific app. But I can't seem to find a way to make it use static files from outside app.

Given app inherits everything, but static files.

My settings.py:

STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.

)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
INSTALLED_APPS = (    
'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'south',
    'myproject.apps.finance',
    'myproject.apps.base',
    'django.contrib.admin',
  )

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
)

This is my current homepage settings:

url for homepage:

from django.conf.urls import patterns, include, url
from myproject.views import hello

urlpatterns = patterns('',
   ('', hello),
)

view of homepage:

from django.shortcuts import render_to_response
from django.http import Http404, HttpResponse
import datetime

def hello(request):
    hello = "Hello World"
    return render_to_response('home/home.html', {'hello': hello})

homepage template:

{% extends "base/base.html" %}

{% block title %} My Homepage {% endblock %}
{% block content %}
<p>I say {{ hello }}</p>

{% endblock %}

base template:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <link rel="stylesheet" href="{{ STATIC_URL }}/css/style.css">
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My Personal Finance Site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <section class="divider1">
    <p>Thanks for visiting my site.</p>
    <p>All rights reserved</p>
    </section>
    {% endblock %}
</body>
</html>

my CSS file is located in empty project called base. But I think there could be better way to use static files that are outside given app.

So what would be the best way to link base template with css file to make other templates that intherits base, to get same css file configuration?

like image 729
Andrius Avatar asked Feb 08 '13 08:02

Andrius


Video Answer


1 Answers

base.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    {% block css %}
    <link rel="stylesheet" href="{{ STATIC_URL }}/css/style.css">
    {% endblock %}
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My Personal Finance Site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <section class="divider1">
    <p>Thanks for visiting my site.</p>
    <p>All rights reserved</p>
    </section>
    {% endblock %}
</body>
</html>

page.html

{% extends "base/base.html" %}

{% block title %} My Homepage {% endblock %}

{% block css %}{{block.super}}
//put css here
{% endblock %}

{% block content %}
<p>I say {{ hello }}</p>

{% endblock %}

urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

from project_name import settings

admin.autodiscover()

urlpatterns = patterns('',
   .......
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += staticfiles_urlpatterns()

settings.py

import os
import sys

..........................

SITE_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(SITE_ROOT, 'app_name'))

MEDIA_ROOT = os.path.join(SITE_ROOT, 'media')
MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
STATIC_URL = '/static/'

STATICFILES_DIRS = (
   # Put strings here, like "/home/html/static" or "C:/www/django/static".
   # Always use forward slashes, even on Windows.
   # Don't forget to use absolute paths, not relative paths.
   os.path.join(SITE_ROOT, 'staticfiles'),
)

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.
   os.path.join(SITE_ROOT, 'templates'),
)

....................
like image 126
catherine Avatar answered Oct 12 '22 22:10

catherine