Post Extensions

Posts can be extended to attach arbitrary fields to a post instance.

E.g. one want’s to have in a template a field or placeholder related to a post.

{{ post.extension.some_field }}
{% render_placeholder post.placeholder_extension.some_placeholder %}

Define the models in your models.py

from cms.models import CMSPlugin, PlaceholderField

from djangocms_blog.models import Post

class PostExtension(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='extension')
    some_field = models.CharField(max_length=10)

class PostPlaceholderExtension(models.Model):
    post = models.OneToOneField(Post, on_delete=models.CASCADE, related_name='placeholder_extension')
    some_placeholder = PlaceholderField('some_placeholder')

Define a inline in your admin.py

from .models import PostExtension

class PostExtensionInline(admin.TabularInline):
    model = PostExtension
    fields = ['some_field']
    classes = ['collapse']
    extra = 1
    can_delete = False
    verbose_name = "PostExtension"
    verbose_name_plural = "PostExtensions"

Register the extension in djangocms_blog

import djangocms_blog.admin as blog_admin
blog_admin.register_extension(PostExtensionInline)
blog_admin.register_extension(PostPlaceholderExtension)

After this the inline will be available in the Post add and Post change admin forms and a PostPlaceholderExtension instance will be automatically created when a post object is created.