Table of Contents
Django-cms Installation
User virtualenv and pip to avoid dependency problems.
$ yum install python2.6 python-setuptools python-imaging virtualenv --no-site-packages mysite-env
“No site packages” create isolated env from host env.
Install Django. From version 1.7.0 django has built-in migration, south is not needed.
source mysite-env/bin/activate (env)$ pip install django django-cms <del>south</del> (env)$ django-admin.py startproject mycmsproject
Installing Packages
Image Support
Install JPEG support on host (outside virtualenv!):
sudo yum install python-devel libjpeg-devel freetype-devel libpng-devel sudo yum install mysql-devel mysql-common mysql-libs
Reinstall Pillow
pip install -I Pillow
Mysql-python
pip install mysql-python
Packages
Following django packages are listed in requirements.txt:
# Bare minimum django-cms>=3.0 # These dependencies are brought in by django CMS, but if you want to # lock-in their version, specify them Django>=1.7 South==1.0.2 # Only needed for Django < 1.7 django-mptt==0.6.1 django-sekizai==0.7 django-classy-tags==0.5 djangocms-admin-style==0.2.2 six==1.3.0 # Optional, recommended packages Pillow>=2 django-filer==0.9.8 cmsplugin-filer==0.10.1 django-reversion==1.8 # Server packages mysql django-debug-toolbar
Install those packages:
pip install -r requirements.txt
Install third-party app in current project:
(vfoss_env)[td@localhost vfoss_org]$ pip install --install-option="--install-purelib=$(pwd)" easy_thumbnails
Dump libs:
$ pip freeze>requirements.txt $ pip install -r requirements.txt
Create a new Django project
django-admin.py startproject myproject
Configuring your project for django CMS
Open the settings.py file in your project.
To make your life easier, add the following at the top of the file:
# -*- coding: utf-8 -*- import os gettext = lambda s: s BASE_DIR = os.path.dirname(os.path.dirname(__file__))
Add the following apps to your INSTALLED_APPS. This includes django CMS itself as well as its dependencies and other highly recommended applications/libraries:
'cms', # django CMS itself 'treebeard', # utilities for implementing a tree 'menus', # helper for model independent hierarchical website navigation 'south', # Only needed for Django < 1.7 'sekizai', # for javascript and css management 'djangocms_admin_style', # for the admin skin. You **must** add 'djangocms_admin_style' in the list **before** 'django.contrib.admin'. 'django.contrib.messages', # to enable messages framework (see :ref:`Enable messages <enable-messages>`)
Install Module with Pip
pip install git+https://github.com/nadobit/django-filer.git@support/0.9.8
Debug-Toolbar
Bug: https://github.com/django-debug-toolbar/django-debug-toolbar/issues/457
Setup Debug-toolbar explicitly as followed:
http://django-debug-toolbar.readthedocs.org/en/1.2.2/installation.html#explicit-setup
Adding django-cms Plugins
Create New Django Project
django-admin startproject vfoss_org
Configure Django-cms app (django 1.8)
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # -*- coding: utf-8 -*- import os gettext = lambda s: s #BASE_DIR = os.path.dirname(os.path.dirname(__file__)) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Application definition INSTALLED_APPS = ( 'django.contrib.sites' 'djangocms_admin_style', # for the admin skin. You **must** add 'djangocms_admin_style' in the list **before** 'django.contrib.admin'. 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', # to enable messages framework (see :ref:`Enable messages <enable-messages>`) 'django.contrib.staticfiles', 'reversion', 'cms', # django CMS itself 'treebeard', # utilities for implementing a tree 'menus', # helper for model independent hierarchical website navigation #'south', # Only needed for Django < 1.7 'sekizai', # for javascript and css management ) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.doc.XViewMiddleware', 'django.middleware.common.CommonMiddleware', 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.page.CurrentPageMiddleware', 'cms.middleware.toolbar.ToolbarMiddleware', 'cms.middleware.language.LanguageCookieMiddleware', ) TEMPLATE_CONTEXT_PROCESSORS = ( 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'django.core.context_processors.i18n', 'django.core.context_processors.request', 'django.core.context_processors.media', 'django.core.context_processors.static', 'sekizai.context_processors.sekizai', 'cms.context_processors.cms_settings', ) TEMPLATE_DIRS = ( # The docs say it should be absolute path: BASE_DIR is precisely one. # Life is wonderful! os.path.join(BASE_DIR, "templates"), ) CMS_TEMPLATES = ( ('template_1.html', 'Template One'), ('template_2.html', 'Template Two'), ) ROOT_URLCONF = 'vfoss_org.urls' WSGI_APPLICATION = 'vfoss_org.wsgi.application' # Database # https://docs.djangoproject.com/en/1.7/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Site SITE_ID = 1 # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.7/howto/static-files/ STATIC_ROOT = os.path.join(BASE_DIR, "static") STATIC_URL = "/static/" #For uploaded files, you will need to set up the MEDIA_ROOT setting: MEDIA_ROOT = os.path.join(BASE_DIR, "media") MEDIA_URL = "/media/"
Migration with Django 1.7, 1.8
During transition from South to Django 1.7, we have to specify which app use which migration solution using
137 MIGRATION_MODULES = { 138 ## not needed for django 1.7.8 from v.3.0. Defaul migration folder is cms.migrations. 139 #'cms': 'cms.migrations_django', 140 #'menus': 'menus.migrations_django', 141 142 ## Still using migrations_django for django 1.7 migrations. 143 'filer': 'filer.migrations_django', 144 'cmsplugin_filer_image': 'cmsplugin_filer_image.migrations_django', 145 'djangocms_text_ckeditor': 'djangocms_text_ckeditor.migrations_django', 146 147 ## not checked. vim 0001* in app/migrations to see if it use django migration or South. 148 # Add also the following modules if you're using these plugins: 149 #'djangocms_file': 'djangocms_file.migrations_django', 150 #'djangocms_flash': 'djangocms_flash.migrations_django', 151 #'djangocms_googlemap': 'djangocms_googlemap.migrations_django', 152 #'djangocms_inherit': 'djangocms_inherit.migrations_django', 153 #'djangocms_link': 'djangocms_link.migrations_django', 154 #'djangocms_picture': 'djangocms_picture.migrations_django', 155 #'djangocms_snippet': 'djangocms_snippet.migrations_django', 156 #'djangocms_teaser': 'djangocms_teaser.migrations_django', 157 #'djangocms_video': 'djangocms_video.migrations_django', 158 #'aldryn_news': 'aldryn_news.migrations_django', 159 }
First Run
From django 1.7 no syncdb but using South:
./manage.py makemigrations ./manage.py migrate python manage.py migrate app_name ./manage.py cms check #admin python manage.py createsuperuser
python manage.py validate python manage.py runserver
Django migration tracks app migration using database:
+-----------------------+ | Tables_in_vfossdb | +-----------------------+ | django_migrations | | django_select2_keymap | +-----------------------+
“makemigrations” will create migration files and “migrate” actually execute those files. In case database table of an app already exists, using “–fake” will skip creating the table.
CMSPlugin App Hook
restart django-cms after adding apphook to a page
Troubleshooting
Migration Issues
ERROR: migration invalid base
django.db.migrations.state.InvalidBasesError: Cannot resolve bases for [<ModelState: 'cmspluginvfossproject.ProjectPlugin'>] This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth) in an app with no migrations; see https://docs.djangoproject.com/en/1.7/topics/migrations/#dependencies for more
Remove (squash all migration)
./manage.py migrate --fake cms zero
or try remove old migrations files and recreate them:
rm cmsplugin_vfoss_project/migrations/0001* ./manage.py makemigrations ./manage.py migrate
Error: PEP440Warning
error: Could not find suitable distribution for Requirement.parse('django-mptt==0.5.2,==0.6,==0.6.1')
Diagnose Version Problem
Version is specified in setup.py of the package.
old:
'django-mptt==0.5.2,==0.6,==0.6.1',
new, someone says never use '==':
'django-mptt>=0.6,<0.6.2',
Problem
pip install django-abc No matching distribution found for django-mptt==0.5.2,==0.6,==0.6.1 (from django-filer->aldryn-news)
Goto git django-filer and look at setup.py
New version may already has new version spec.
pip install django-filer --upgrade
Headline
error: Django 1.8 is installed but Django<1.8,>=1.6 is required by set(['django-cms', 'aldryn-boilerplates'])
Error: table does not exist
Look if debug-toolbar involves then first disable it from INSTALLED_APPS
Django 1.7 Bugs - Migration - Upgrade
Migration
settings.py
MIGRATION_MODULES = { 'cms': 'cms.migrations_django', 'menus': 'menus.migrations_django', 'filer': 'filer.migrations_django', # Add also the following modules if you're using these plugins: #'djangocms_file': 'djangocms_file.migrations_django', #'djangocms_flash': 'djangocms_flash.migrations_django', #'djangocms_googlemap': 'djangocms_googlemap.migrations_django', #'djangocms_inherit': 'djangocms_inherit.migrations_django', #'djangocms_link': 'djangocms_link.migrations_django', #'djangocms_picture': 'djangocms_picture.migrations_django', #'djangocms_snippet': 'djangocms_snippet.migrations_django', #'djangocms_teaser': 'djangocms_teaser.migrations_django', #'djangocms_video': 'djangocms_video.migrations_django', 'djangocms_text_ckeditor': 'djangocms_text_ckeditor.migrations_django', #'aldryn_news': 'aldryn_news.migrations_django', }
./manage.py makemigrations ./manage.py migrate
Clean Database
Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
sqlflush
./manage.py sqlflush --help Returns a list of the SQL statements required to return all tables in the database to the state they were in just after they were installed.
Table django_session not exist
In MySQL Database delete row 'djangosessions' from the table 'djangomigrations'.
delete from django_migrations where id=17;
Delete all migration files in migrations folder.
Try again python manage.py makemigrations and python manage.py migrate command.
Headline
Django 1.8 Bugs - Migration - Upgrade
Uninstall South
There is no South database module 'south.db.mysql' for your database. Please either choose a supported database, check for SOUTH_DATABASE_ADAPTER[S] settings, or remove South from INSTALLED_APPS. pip uninstall South
MIGRATION_MODULES
Django-cms 3.1. migrations by Django is now in migrations and south migration is in southmigrations. so remove the paths in settings.MIGRATIONMODULES.
rm -rf vfoss_env
virtualenv --no-site-packages vfoss_org_env
pip install -r requirement.txt
mysql> drop database [database name]
create database [database name]
./manage.py makemigrations
./manage.py migrate
Django Template
problem:
from django.template import VariableNode, Variable ImportError: cannot import name VariableNode
change
from django.template import TemplateSyntaxError, NodeList, VariableNode
to
from django.template.base import TemplateSyntaxError, NodeList, VariableNode
in
vim /mnt/extdata/workspace/70_project_vfoss/vfoss_django_dev_ws/vfoss_org_env/lib/python2.7/site-packages/cms/utils/placeholder.py vim /mnt/extdata/workspace/70_project_vfoss/vfoss_django_dev_ws/vfoss_org_env/lib/python2.7/site-packages/sekizai/helpers.py
django.contrib.formtools
Formtools is removed from django 1.8: https://docs.djangoproject.com/en/1.8/releases/1.8/#removal-of-django-contrib-formtools
Install it: https://docs.djangoproject.com/en/1.8/ref/contrib/formtools/
Problem:
File "/mnt/extdata/workspace/70_project_vfoss/vfoss_django_dev_ws/vfoss_org_env/lib/python2.7/site-packages/cms/plugin_pool.py", line 6, in <module> from django.contrib.formtools.wizard.views import normalize_name ImportError: No module named formtools.wizard.views
change:
from django.contrib.formtools.wizard.views import WizardView
to:
from formtools.wizard.views import WizardView
Headline
Level 2 Headline
Show dependency tree:
pip install pipdeptree pipdeptree -fl
Plugin Development
djangocms-blog
Add static placeholder: http://www.pylucid.org/en/blog/2015/02/22/setup-a-enhanced-djangocms-blog-page/
PlaceholderField
models.py
content = PlaceholderField('post_content', related_name='post_content')
With Django-cms 3.1, this field is edited directly from front-end. Switch to “structure” editing and insert Text-plugin.
aldryn-news (not used)
Not used because hvad issues Forked https://github.com/aldryn/aldryn-news to github/vfoss-org
Prerequsites
- django 1.7.8
- django-cms 3.1
Add Linked Url to aldryn-news model
Enable link to external url.
See cmsplugin-news!
vim aldryn_news/models.py
141 class News(TranslatableModel): 142 THUMBNAIL_SIZE = getattr(settings, 'ALDRYN_NEWS_ITEM_THUMBNAIL_SIZE', '100x100') 143 144 translations = TranslatedFields( 145 title=models.CharField(_('Title'), max_length=255), 146 slug=models.CharField(_('Slug'), max_length=255, blank=True, 147 help_text=_('Auto-generated. Clean it to have it re-created. ' 148 'WARNING! Used in the URL. If changed, the URL will change. ')), 149 lead_in=HTMLField(_('Lead-in'), 150 help_text=_('Will be displayed in lists, and at the start of the detail page')), 151 meta={'unique_together': [['slug', 'language_code']]} 152 ) 153 key_visual = FilerImageField(verbose_name=_('Key Visual'), blank=True, null=True) 154 content = PlaceholderField('blog_post_content') 155 publication_start = models.DateTimeField(_('Published Since'), default=datetime.datetime.now, 156 help_text=_('Used in the URL. If changed, the URL will change.')) 157 publication_end = models.DateTimeField(_('Published Until'), null=True, blank=True) 158 category = models.ForeignKey(Category, verbose_name=_('Category'), blank=True, null=True, 159 help_text=_('WARNING! Used in the URL. If changed, the URL will change.')) 160 objects = RelatedManager() 161 published = PublishedManager() 162 tags = TaggableManager(blank=True, through=TaggedItem) 163 # Add new field <------------ 164 link = models.URLField(_('Link'), blank=True, null=True, 165 help_text=_('This link will be used a absolute url' 166 )) ........ 176 def get_absolute_url(self, language=None): 177 language = language or get_current_language() 178 slug = get_slug_in_language(self, language) 179 180 #if self.link: 181 # if not self.content: # Return URL in the Link 182 return self.link <---------------- 183
Enable Editing The Link Field
vim aldryn_news/admin.py
14 class NewsAdmin(FrontendEditableAdmin, TranslatableAdmin, PlaceholderAdmin): 15 16 list_display = ['__unicode__', 'publication_start', 'publication_end', 'all_translations'] 17 form = NewsForm # Add 'link' <---------------- 18 frontend_editable_fields = ('title', 'lead_in', 'link') 19 20 def get_fieldsets(self, request, obj=None): 21 fieldsets = [ 22 (None, {'fields': ['title', 'slug', 'category', 'publication_start', 'publication_end']}), # Add 'link' <---------------- 23 (None, {'fields': ['key_visual', 'lead_in', 'link', 'tags']}) 24 ] 25 26 # show placeholder field if not CMS 3.0 27 if LooseVersion(cms.__version__) < LooseVersion('3.0'): 28 fieldsets.append( 29 ('Content', { 30 'classes': ['plugin-holder', 'plugin-holder-nopage'], 31 'fields': ['content']})) 32 33 return fieldsets 34 35 admin.site.register(News, NewsAdmin)
Edit Template
Copy aldryn-news tempate to templates folder and insert bootsnipp.
Auto Add Author When Editing Model
In Django framework there is a chain of services / component processing request and return response. E.g., Request –
> View --> Form --> DB, Response or Request --> ModelAdmin --> Form --> DB, Response. Each component has functions that can be overridden to modify the data object passed through the chain.
-
Class Based View
=
ModelAdmin + ModelForm
Just modify savemodel as shown here:
* http://djangopatterns.com/patterns/models/automatically_filling_user/
===== Adding Social Authentication =====
Trying this: https://github.com/omab/python-social-auth#installation
====== Error & solution ======
==== Clear database ====
python manage.py syndb
if using south
python manage.py migrate
For initial update
python manage.py syncdb –all
python manage.py migrate –fake
==== Thumbnail processor ====
Install thumbnail app:
pip install easythumbnails
or
pip install sorl-thumbnail
Edit settings.py
162 # filer 163 THUMBNAIL_PROCESSORS = ( 164 'easy_thumbnails.processors.colorspace', 165 'easy_thumbnails.processors.autocrop', 166 #'easy_thumbnails.processors.scale_and_crop', 167 'filer.thumbnail_processors.scale_and_crop_with_subject_location', 168 'easy_thumbnails.processors.filters', 169 )
js & css files under /static/ can't be found
Problem:
Cause: django dev-enviroment doesn't serve static file. Before deployment python manage.py collectstatic must be run so that all static files are copied to “settings.STATIC_ROOT” by python-staticfiles. See python-staticfiles documentation.
Solution: move all static files to 'static-dev' and add 'os.path.join(PROJECTPATH, “static-dev/jquery/”),' to 'settings.STATICFILESDIRS'.
When deploy always run collectstatic
This will also copy static files from themes, template to static dir. Important.
settings.py SITE_ID
When add new site, change SITE_ID=2 so localhost use it.
Multi subdomain mit site
I tried to change code in django-cms/cms/views.py and menu.py
from django.conf import settings
class CheckSubdomain(object):
def process_request(self, request):
if settings.DEBUG: return
sites = Site.objects.filter(domain=request.get_host())
if len(sites): settings.SITE_ID = sites[0].pk