我为员工提供以下模型和模型形式:
models.py
class Employee(models.Model):
reports_to = models.ForeignKey(
'self', on_delete=models.SET_NULL,
null=True, blank=True)
forms.py
class EmployeeForm(forms.ModelForm):
class Meta:
model = Employee
这个想法是,雇员的老板本身就是雇员。
问题在于,当我更新实例时,创建的相应表单字段是所有员工(包括我自己更新的对象)的下拉列表。
是否有一种简便的方法可以从下拉选项中删除实例本身,以使没有员工将自己作为老板?
PS:我不是要寻找一种在提交表单后验证表单字段的解决方案,而是要从表单下拉列表中完全删除该选项。谢谢!
答案 0 :(得分:2)
是的,您可以修改相应字段的queryset
,并忽略该实例(如果已存在该实例)。喜欢:
class EmployeeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
instance = self.instance
if instance.pk is not None:
self.fields['reports_to'].queryset = Employee.objects.exclude(pk=instance.pk)
class Meta:
model = Employee
如果实例具有不是pk
的{{1}}(这意味着您 edit 实例,而不创建新实例) ),然后我们“修补”除所有None
之外的所有Employee
的查询集。