如何基于BlogConfig实例为DjangoCMS-Blog条件添加Post Extension内联表单
基于BlogConfig的AppHook条件显示Post Extension内联表单
核心思路
Post Extension的内联显示逻辑需要绑定到BlogConfig对应的AppHook判断上,通过重写内联类的权限方法或自定义PostAdmin的内联获取方法来实现条件控制。
方法一:通过内联类的权限方法控制显示
直接修改你的PostExtensionInline类,在权限判断方法里加入BlogConfig的AppHook校验:
from django.contrib import admin from your_app.models import PostExtension from zinnia.models import Blog # 替换为你的Blog模型实际路径 class PostExtensionInline(admin.StackedInline): model = PostExtension extra = 1 def _get_blog_config(self, request, obj): """辅助方法:获取当前对应的BlogConfig""" if obj: # 编辑场景:从Post实例关联的Blog获取配置 return obj.post.blog.config # 创建场景:从请求参数获取选中的Blog ID,再取配置 blog_id = request.POST.get('blog') or request.GET.get('blog') if not blog_id: return None return Blog.objects.get(id=blog_id).config def has_add_permission(self, request, obj=None): blog_config = self._get_blog_config(request, obj) return blog_config and blog_config.apphook == "你的目标AppHook名称" def has_change_permission(self, request, obj=None): blog_config = self._get_blog_config(request, obj) return blog_config and blog_config.apphook == "你的目标AppHook名称"
方法二:自定义PostAdmin控制内联列表
如果需要更灵活的内联管理,继承默认的PostAdmin并重写get_inlines方法:
from django.contrib import admin from zinnia.admin.entry import EntryAdmin as ZinniaPostAdmin # 替换为你的PostAdmin实际路径 from zinnia.models import Entry # 替换为你的Post模型实际路径 from your_app.admin import PostExtensionInline class CustomPostAdmin(ZinniaPostAdmin): def get_inlines(self, request, obj=None): # 获取默认内联列表 inlines = super().get_inlines(request, obj) # 获取当前BlogConfig blog_config = None if obj: blog_config = obj.blog.config else: blog_id = request.POST.get('blog') or request.GET.get('blog') if blog_id: from zinnia.models import Blog blog_config = Blog.objects.get(id=blog_id).config # 根据AppHook判断是否添加内联 target_apphook = "你的目标AppHook名称" if blog_config and blog_config.apphook == target_apphook: if PostExtensionInline not in inlines: inlines.append(PostExtensionInline) else: inlines = [inline for inline in inlines if inline != PostExtensionInline] return inlines # 替换默认的PostAdmin admin.site.unregister(Entry) admin.site.register(Entry, CustomPostAdmin)
补充说明
- 之前自定义fieldsets无效、
update_fields中找不到my_new_field是正常的:Post Extension字段属于内联表单,并不在Post模型的主字段集中,所以不会出现在主模型的字段更新逻辑里。 - 创建场景下,用户未选择Blog时内联会默认隐藏,选择Blog后页面刷新即可触发条件判断。
内容的提问来源于stack exchange,提问作者sodimel
相关产品推荐
相关产品推荐

