简体   繁体   中英

How to update djangocms-blog post extensions fields position?

I have some post extensions adding new fields in my Posts objects.

I created the migration, launched my website, and I thought that maybe customizing the fieldsets would allow me to customize the position of the post extensions fieldset too.

That didn't seems to be the case. I created a new SmallIntegerField named my_new_field in a PostExtension class that I registered using blog_admin.register_extension(PostExtensionInline) (I also created the PostExtensionInline class by following the doc ).

I added a breakpoint in my update_fields function that I'm using to update the order of the fields of my posts (see this SO question and its answer for more infos on this), and I can't find any mention to my_new_field in the fgets arg:

Quit the server with CONTROL-C.
> /home/me/my-test-app/my_test_app/update_fields.py(3)update_fields()
-> return fsets
(Pdb) l
  1     def update_fields(fsets, request, obj):
  2         breakpoint()
  3  ->     return fsets
[EOF]
(Pdb) fsets
[(None, {'fields': ['title', 'subtitle', 'slug', 'publish', 'categories', 'abstract', 'sites', 'author']}), ('Info', {'fields': [['tags', 'related'], ['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',)})]

How can I update my field position? (see edit below)


edit: I can't think of a way to tweak the order of the post extension fields. But I realized that my real problem (yeah yeah that's a case of XYproblem ) is that I want conditional inline (only include the post extension for a certain apphook that's using a defined BlogConfig instance.

How to conditionally add the inline post extension form/fields to my admin create form based on the BlogConfig instance?

So I figured it out (and it's not pretty, but it works).

I added those lines in my admin.py :

# replace PostAdmin get_inlines function in order to hide event_date on regular blog posts
from djangocms_blog.admin import PostAdmin
from .misc import get_inline_instances as patched_get_inline_instances
PostAdmin.get_inline_instances = patched_get_inline_instances

And here's my code on misc.py :

def get_inline_instances(self, request, obj=None):
    from djangocms_blog.cms_appconfig import BlogConfig
    from djangocms_blog.admin import PostAdmin
    from json import loads

    inline_instances = super(PostAdmin, self).get_inline_instances(request, obj)

    if "app_config" in request.GET:
        # get blog config instance from request
        blog_config = BlogConfig.objects.filter(pk=request.GET["app_config"])
        # get config from saved json
        config = loads(blog_config.values()[0]["app_data"])
        # get template_prefix from config

        if config:
            template_prefix = config['config']['template_prefix']
            if template_prefix == "djangocms_blog_agenda":
                return inline_instances
    return []

I used the template_prefix value in a BlogConfig instance of djangocms_blog to update the code based on the request:

  • If we have "djangocms_blog_agenda" in the template_prefix , then return the inline instances.
  • If we don't have this (default BlogConfig , another BlogConfig that do not need my current post extension fields), return an empty list.

The result can be viewed here:

博客截图

Blog posts list screenshot, we can see that the articles are displayed by most recent "published date" first.


选择博客配置截图

We can select our blog config after a click on "Blog > Add Post...".


议程截图

Agenda post creation screenshot, we can see that there's a post extension named "event date" (not present in Blog post creation screenshot).


议程列表截图

Agenda list screenshot, we can see that the "events" are displayed by nearest future "event date" date.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM