Admin customization¶
As any other django model admin, PostAdmin
can be customized by extending it adding a subclass in one of the
project’s applications.
admin.site.unregister(Post)
@admin.register(Post)
class CustomPostAdmin(PostAdmin):
...
you_attributes_and_methods
Customizing the fieldsets¶
Due to the logic in djangocms_blog.admin.PostAdmin.get_fieldsets()
method, it’s advised to customize the
fieldsets by overriding two private attributes djangocms_blog.admin.PostAdmin._fieldsets
and
djangocms_blog.admin.PostAdmin._fieldset_extra_fields_position
.
_fieldsets¶
_fieldsets
attribute follow the standard Django Admin fieldset structure. This is the primary source for customization.
You can freely rearrange and remove fields from this structure as you would to in a normal fieldsets
attribute; the only
caveat is that you must ensure consistency extra fields position set by _fieldset_extra_fields_position
.
_fieldset_extra_fields_position¶
As some fields are managed by settings and apphook config, they are added to the final fieldsets
by PostAdmin.get_fieldsets
;
you can customize their position (or hide them) by overriding _fieldset_extra_fields_position
attribute.
The attribute is a dictionary containing the fields name as key, and by providing their position in the fieldsets as tuple.
Use a 2-item tuple if the field must be appended at the row level (e.g.: (None, {"fields": ["field_a", "field_b"]})
) or
a 3-item tuple if the field must be appended in a subgroup (e.g.: (None, {"fields": ["field_a", ["field_b"[]})
.
Example¶
admin.site.unregister(Post)
@admin.register(Post)
class CustomPostAdmin(PostAdmin):
...
_fieldsets = [
(None, {"fields": ["title", "subtitle", "slug", "publish", "categories"]}),
(
_("Info"),
{
"fields": [["tags"], ["date_published", "date_published_end", "date_featured"], "app_config", "enable_comments"],
"classes": ("collapse",),
},
),
(
_("Images"),
{"fields": [["main_image", "main_image_thumbnail", "main_image_full"]], "classes": ("collapse",)},
),
(_("SEO"), {"fields": [["meta_description", "meta_title", "meta_keywords"]], "classes": ("collapse",)}),
]
_fieldset_extra_fields_position = {
"abstract": [0, 1],
"post_text": [0, 1],
"sites": [1, 1, 0],
"author": [1, 1],
"enable_liveblog": None,
"related": [1, 1, 0],
}
This example will result in:
"enable_liveblog"
: hidden even if enabled in settings"sites"
: added in the same subgroup as"tags"
"author"
: appended after the"enable_comments"
field"app_config"
field moved to"Info"
fieldset
Filter function¶
You can add / remove / filter fields at runtime by defining a method on you custom admin and proving its name in BLOG_ADMIN_POST_FIELDSET_FILTER.
Method must take the following arguments:
fsets
: current fieldsets dictionaryrequest
: current admin requestobj
(default:None
): current post object (if available)
and it must return the modified fieldsets dictionary.
Function example:
def fieldset_filter_function(fsets, request, obj=None):
if request.user.groups.filter(name='Editor').exists():
fsets[1][1]['fields'][0].append('author') # adding 'author' field if user is Editor
return fsets