如何在Django Admin中将多对多字段显示为复选框?
解决Django Admin列表页布尔字段转可编辑复选框的问题
问题背景
你的模型通过多对多关联自定义权限,Admin列表页中can_edit_product、can_edit_price目前以只读布尔值展示,需要改为可直接勾选的复选框并支持保存操作。
实现步骤
完善权限判断与字段配置
在ProductAdmin中实现权限判断方法,标记为布尔类型,并将字段加入可编辑列表:class ProductAdmin(admin.ModelAdmin): # 列表展示字段,首位不能是可编辑字段(Django限制) list_display = ["name", "can_edit_product", "can_edit_price"] # 指定可编辑的字段,会自动转为复选框形式 list_editable = ["can_edit_product", "can_edit_price"] def can_edit_product(self, obj): return obj.permissions.filter(code_name="can_edit_product").exists() # 标记为布尔类型,默认显示勾选/叉号,加入list_editable后变为可编辑复选框 can_edit_product.boolean = True can_edit_product.short_description = "可编辑产品" def can_edit_price(self, obj): return obj.permissions.filter(code_name="can_edit_price").exists() can_edit_price.boolean = True can_edit_price.short_description = "可编辑价格"实现勾选后的保存逻辑
重写save_model方法,处理复选框状态变化对应的多对多关系更新:def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) # 获取表单提交的复选框状态 edit_product_status = form.cleaned_data.get("can_edit_product") edit_price_status = form.cleaned_data.get("can_edit_price") # 获取或创建对应权限实例 edit_product_perm, _ = CustomPermissions.objects.get_or_create(code_name="can_edit_product") edit_price_perm, _ = CustomPermissions.objects.get_or_create(code_name="can_edit_price") # 根据勾选状态更新多对多关联 if edit_product_status: obj.permissions.add(edit_product_perm) else: obj.permissions.remove(edit_product_perm) if edit_price_status: obj.permissions.add(edit_price_perm) else: obj.permissions.remove(edit_price_perm)
注意事项
- 确保
CustomPermissions中已存在对应code_name的权限实例,或通过get_or_create自动创建(代码中已包含该逻辑)。 list_editable中的字段必须同时存在于list_display中,且list_display的第一个字段不能是可编辑字段(Django的内置限制)。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

