You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何限制WBS模型下拉框不显示自身作为父级选项

解决Django WBS编辑表单父级下拉排除自身的问题

问题分析

你当前的模型验证器逻辑有误,validate_not_self里的value == value.parent_wbs是在判断选中的父级WBS是否以自己为父级,和当前编辑的WBS完全无关,根本起不到防止自引用的作用。要实现需求,需要从表单层面过滤选项和模型层面验证两方面入手,双重保障。

解决方案

1. 表单层面:编辑时下拉框排除当前WBS

创建WBS对应的ModelForm,在初始化时过滤掉当前实例本身,让用户看不到自身选项:

from django import forms
from .models import WBS

class WBSForm(forms.ModelForm):
    class Meta:
        model = WBS
        fields = ['name', 'project', 'num', 'parent_wbs']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 只有编辑已有实例时才过滤
        if self.instance.pk:
            # 排除当前WBS自身
            self.fields['parent_wbs'].queryset = WBS.objects.exclude(pk=self.instance.pk)
            # 可选:如果WBS父级必须属于同一个项目,加上项目过滤
            # self.fields['parent_wbs'].queryset = WBS.objects.filter(project=self.instance.project).exclude(pk=self.instance.pk)

2. 模型层面:验证防止自引用提交

即使表单过滤了选项,仍可能通过API、后台直接修改等方式提交非法数据,所以要在模型的clean方法里添加验证逻辑:

修改你的WBS模型:

from django.db import models
from django.core.exceptions import ValidationError
from .models import Project  # 确保导入Project模型

class WBS(models.Model):
    name = models.CharField(max_length=100)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    num = models.IntegerField(default=0)
    parent_wbs = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='child_wbs')
    created_on = models.DateTimeField(auto_now_add=True)
    created_by = models.IntegerField(blank=True, default=0)
    modified_on = models.DateTimeField(auto_now=True)
    modified_by = models.IntegerField(blank=True, default=0)

    def __str__(self):
        return self.name

    def clean(self):
        super().clean()
        # 检查父级是否为自身
        if self.parent_wbs is not None and self.parent_wbs == self:
            raise ValidationError({"parent_wbs": "WBS不能设置自身作为父级"})

3. 移除无效的验证器

原模型里的validate_not_self函数逻辑错误,直接删除即可,不需要再绑定到字段上。

效果说明

  • 打开编辑表单时,父级WBS下拉框里不会出现当前WBS选项,从前端避免误操作。
  • 若有人尝试通过其他方式提交自引用数据,模型的clean方法会抛出验证错误,阻止数据保存。

内容的提问来源于stack exchange,提问作者Adnan Nazir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:05:20