Django表单:为博客组用户显示额外分类的问题排查
问题分析与修复方案
核心问题点
- 用户组判断逻辑错误:当前代码通过
User.objects.filter(groups__name='blogger').exists()检查系统中是否存在blogger组用户,而非判断当前登录用户是否属于该组——这会导致只要系统里有blogger用户,所有用户都会看到专属分类。 - 分类选项覆盖而非追加:给blogger用户设置分类时直接替换了初始3个分类,没有合并,导致blogger用户看不到普通分类。
修复后的代码
class PostCreateForm(ModelForm): class Meta: model = Post fields = [ "title", "category", "associated_portfolios", "body", ] exclude = ('allow_comments',) def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) # 判断当前用户是否属于blogger组(先检查user是否有效) is_blogger = user.groups.filter(name='blogger').exists() if user else False print("Current User:", user) print("Is Blogger:", is_blogger) super().__init__(*args, **kwargs) # 先设置普通用户的基础分类 base_categories = [ ("Watchlist", "Watchlist"), ("Lesson/Review", "Lesson/Review"), ("General", "General"), ] self.fields['category'].choices = base_categories # 若是blogger用户,追加专属分类 if is_blogger: blogger_categories = [ ("Analysis", "Analysis"), ("Milestone", "Milestone"), ("Features", "Features"), ("Tutorials", "Tutorials"), ("Careers", "Careers"), ("Community", "Community"), ] # 合并基础分类与专属分类 self.fields['category'].choices += blogger_categories
关键修改说明
- 修正用户身份判断:改用
user.groups.filter(name='blogger').exists(),同时增加user非空判断,确保基于当前登录用户的组身份进行逻辑处理。 - 分类合并逻辑:先设置普通用户的3个基础分类,再为blogger用户追加专属分类,实现"blogger用户可见全部分类"的需求。
- 简化语法:Python 3+环境下直接使用
super().__init__,无需显式传入类名和self,代码更简洁。
修改后效果:
- 普通用户仅显示初始3个分类
- blogger组用户显示基础3个分类 + 专属6个分类,共9个分类
内容的提问来源于stack exchange,提问作者Alex Winkler
相关产品推荐
相关产品推荐

