20

I'm in the process of testing out a SASS implementation of Foundation 5 using Django-Bower. I'm new to the idea of Bower and am having a bit of confusion as to how to get this setup working properly.

I have django-bower installed and configured to run properly. After I added foundation to the bower apps config and ran manage.py bower_install I can see that the foundation files have indeed been installed properly. I can also use the static tag to load the JS into a template without an issue, so I feel like I'm about halfway there.

My issue is in regards to how to actually use the foundation files that bower installed with my custom SASS files, and the best way to compile those SASS files into CSS. I know that I'm supposed to be able to include foundation into my SASS with @include "foundation" but I'm lost as to how to get the SASS file to "see" the foundation files in components/bower_components/foundation/sass and how to set up a compile to put the css into the correct static file.

UPDATE: PyCharm has an option to watch sass files and compile them, so I now have an option for compiling the files, but when I attempt to import foundation i get error blog3.sass (Line 1: File to import not found or unreadable: foundation.

For reference, here's my file structure:

├── blog3
│   └── __pycache__
├── components
│   └── bower_components
│       ├── foundation
│       │   ├── css
│       │   ├── js
│       │   │   ├── foundation
│       │   │   └── vendor
│       │   └── scss
│       │       └── foundation
│       │           └── components
│       ├── jquery
│       └── modernizr
│           ├── feature-detects
│           ├── media
│           └── test
│               ├── caniuse_files
│               ├── js
│               │   └── lib
│               └── qunit
└── interface
    ├── migrations
    │   └── __pycache__
    ├── __pycache__
    ├── sass
    └── templates
        └── interface

This is my settings.py

"""
Django settings for blog3 project.

For more information on this file, see
https://docs.djangoproject.com/en/dev/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/dev/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '...'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'annoying',
    'django_extensions',
    'djangobower',
    'interface',

)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'blog3.urls'

WSGI_APPLICATION = 'blog3.wsgi.application'


# Database
# https://docs.djangoproject.com/en/dev/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# Internationalization
# https://docs.djangoproject.com/en/dev/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True  


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/dev/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_FINDERS = (
    'djangobower.finders.BowerFinder',
)

BOWER_COMPONENTS_ROOT = os.path.join(BASE_DIR, "components")
BOWER_INSTALLED_APPS = (
    'jquery',
    'foundation',
)
Nathan Cox
  • 1,299
  • 13
  • 24

2 Answers2

18

SOLUTION WITHOUT PYCHARM WATCHER

  1. Not using pycharm watcher.
  2. django-compressor to compile scss files including compass.
  3. django-bower

This is an example of "how to compile scss files" with django-compressor:

appName/static/scss/app.scss:

@import "../../../components/bower_components/foundation/scss/foundation";
@import "compass";

/* other stuff*/

settings.py:

STATICFILES_FINDERS = (
    .....
    'compressor.finders.CompressorFinder',

)

COMPRESS_PRECOMPILERS = (
    ('text/x-sass', 'sass --compass "{infile}" "{outfile}"'),
    ('text/x-scss', 'sass --scss --compass "{infile}" "{outfile}"'),
)

COMPRESS_URL = '/static/'

template.html:

{% load static %}
{% load compress %}

<head>
    {% compress css %}
        <link href="{% static 'scss/app.scss' %}" media="screen, projection" rel="stylesheet" type="text/x-scss" />
    {% endcompress %}

</head>

Hope this help you.

EDIT

Maybe this is a better config to use @import without relatives paths. -I arg:

PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
BOWER_COMPONENTS_ROOT = os.path.join(PROJECT_PATH, "../components/")
COMPRESS_PRECOMPILERS = (
        ('text/x-sass', 'sass --compass "{infile}" "{outfile}"'),
        ('text/x-scss', 'sass --scss --compass -I "%s/bower_components/foundation/scss" "{infile}" "{outfile}"' % BOWER_COMPONENTS_ROOT),
    )

Now app.scss:

@import "foundation";
@import "compass";

USING PYCHARM WATCHER

Lately I'm appreciating pycharm watcher

  1. Install django-bower

  2. Add a SCSS Watcher from pycharm preferences

  3. In the edit of watcher, into 'Arguments' field I set:

    --compass -I "/$ProjectFileDir$/components/bower_components/foundation/scss" --no-cache --update $FileName$:$FileNameWithoutExtension$.css

So, in the scss file:

@import "foundation";
@import "compass";
Community
  • 1
  • 1
grigno
  • 3,128
  • 4
  • 35
  • 47
  • 1
    Awesome, this is a totally acceptable solution. I was going to be using the compass package for django, but this is a much better solution because it allows me to simply compile files on the fly without needing to run a compass watcher. I wish I could specify compass settings independently of the COMPRESS_PRECOMPILERS variable (which I'm sure is possible, I just don't know how). Also, extra +1 because it looks like I can use this to compile coffeescript too. – Nathan Cox Dec 13 '13 at 17:41
  • 1
    I love django-compressor! – Stefano Mar 18 '14 at 11:15
  • It would be helpful to also note that you can use multiple -I's for load paths. `-I -I ` – KFunk Jul 13 '16 at 00:40
8

packages:

  1. django-pipeline
  2. django-bower

How to compile with django-pipeline:

application.scss:

@import "../../../components/bower_components/foundation/scss/foundation";

settings.py:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'pipeline',
    'djangobower',
)

BOWER_COMPONENTS_ROOT = os.path.join(BASE_DIR, 'components')

STATICFILES_FINDERS = (
    .....
    'djangobower.finders.BowerFinder',  # just for bower components

)

PIPELINE_CSS = {
    'application': {
        'source_filenames': (
            'css/application.scss',
        ),
        'output_filename': 'css/application.css',
        'extra_context': {
            'media': 'screen,projection',
        },
    },
}

PIPELINE_COMPILERS = (
    'pipeline.compilers.sass.SASSCompiler',
)

Then in template:

{% load compressed %}
{% compressed_css 'application' %}

This will compile on developemnt and on collectstatic will compile and compress

carlitux
  • 1,217
  • 10
  • 14
  • 1
    Thanks for taking the time to answer, however I don't like how pipeline automatically sets your working directory to the file being executed (which has been acknowledged as a problem by the django-pipeline github) and decided to go with compressor instead. – Nathan Cox Jan 31 '14 at 21:51
  • here is the django-pipeline issue related to what Nathan Cox said above: https://github.com/cyberdelia/django-pipeline/issues/294 – fjsj Jan 15 '15 at 16:43