first steps with django cms
TRANSCRIPT
PYCON UK 2014
FIRST STEPSWITH DJANGO CMS
by
Iacopo Spalletti
@yakkys
WHO AM I?Founder and Lead developer @NephilaIt
django CMS core developer
django CMS installer author
DJANGO CMS
FIRST LOOKBRIEF OVERVIEW OF DJANGO CMS
FEATURESFEEL FREE TO COME TO THE BOOTH OR
AT THE SPRINTS FOR MORE
WHAT'S DJANGO CMS?'JUST' A CMS FOR DJANGO (APPARENTLY)
With a twist!
DJANGO CMS
HOW IS DIFFERENT?IT'S LIMITED (BY DESIGN)
YOU CANNOT "EXTEND" A PAGE
DJANGO CMS
WHY IS THAT?WHY NOT?
WE HAVE DJANGO MODELS!
GOOD DJANGO CITIZEN
DJANGO CMS
CONTRIBUTING FEATURESdjango CMS provides features that your applications
can use
BASIC CONCEPTSPAGE
PLACEHOLDER
PLUGIN
APPHOOK
FRONTEND EDITOR
LIVES IN A LIVE AND DRAFT VERSION
DEFINED BY THE TEMPLATE APPLIED TO IT
PAGETHE BUILDING BLOCK OF THE CMS
PLACEHOLDERACTIVE AREAS WITHIN YOUR PAGES
PLUGIN CONTAINERS
DEFINED IN THE TEMPLATES
JUST A TEMPLATETAG
PLACEHOLDER
HOW TO DEFINE APLACEHOLDER?
{% placeholder "first_placeholder" %}
PLACEHOLDER
THERE IS MOREclass MyModel(models.Model): name = models.CharField(max_length=200) abstract = models.TextField() content = PlaceholderField()
Composition, not inheritance
PLUGINPlaceholder = Container
Plugin = Content
PLUGIN
WHAT'S A PLUGIN?A content
A bridge towards other Django applications
PLUGIN
WRITING PLUGIN IS EASYclass MyPlugin(CMSPluginBase): name = _('My plugin') render_template = 'myapp/myplugin.html'
PLUGIN
1. PLUGIN CLASSclass MyPlugin(CMSPluginBase): name = _('My plugin') model = MyPluginModel render_template = 'myapp/myplugin.html' def render(self, context, instance, placeholder): newslist = News.objects.all().order_by('date') context.update({ 'instance': instance, 'news_list': newslist[:instance.posts] }) return context
Plugin = ModelAdmin + template + get_context_data
PLUGIN
2. THE PLUGIN MODELIt's the plugin configuration
class MyPluginModel(CMSPlugin): title = models.CharField(max_length=200) posts = models.PositiveIntegerField()
PLUGIN
3. THE TEMPLATETemplate is a standard Django template fragment to
which the plugin generated context is provided
<div class="news_list"><h2>{{ instance.title }}</h2> {% for news in news_list %} <a href="{{ news.get_absolute_url }}"> {{ news.title }}</a><br> {% endfor %}</div>
APPHOOKIs a bridge between the CMS and other Django
applications
In rough terms, it appends the application URLConf to
the page tree
It wraps the URLCon in a class
APPHOOK
SOME CODEclass MyApp(CMSApp): name = _("My App") urls = ["apps.my_app.urls"] menus = [MyMenu]
apphook_pool.register(MyApp)
APPHOOK
THAT'S ALL :)
FRONTEND EDITORWARNING!
IT'S ADDICTIVE!
FRONTEND EDITOR
WHAT'S IT?NEW IN DJANGO CMS 3
ADMIN OUTSIDE THE ADMIN
FRONTEND EDITOR
TOOLBARCOMPLETE
SIMPLE
DYNAMIC
CUSTOMIZABLE
FRONTEND EDITOR
ANCHE NEI VOSTRI MODELEVERY MODEL CAN BE FRONTEND-ENABLED
{% render_model instance "abstract" %}
{% render_model_block instance %}<h3>{{ instance.title }}</h3><div class="date">{{ instance.date }}</{% endrender_model_block %}
SHAMELESS PLUG!
GRAZIE!SEE YOU TOMORROW!
DJANGO CMS SPRINT
And tips and support to use django CMS
Iacopo Spalletti
@yakkys