如何在Django中限制外键中的选项,但始终包含当前值?
我在这里使用了这种方法: 将ModelA中外键的选择限制为ModelB中设置为“活动”的条目。这样,我就可以在ModelB条目过时时停用它们。然后,当用户进入新的ModelA时,只显示活动的ModelB条目如何在Django中限制外键中的选项,但始终包含当前值?,django,django-models,django-forms,django-admin,Django,Django Models,Django Forms,Django Admin,我在这里使用了这种方法: 将ModelA中外键的选择限制为ModelB中设置为“活动”的条目。这样,我就可以在ModelB条目过时时停用它们。然后,当用户进入新的ModelA时,只显示活动的ModelB条目 但是,如果我修改一个引用非活动ModelB的旧ModelA,则非活动ModelB不会显示在列表中。所以我无法保存信息(现在,我正在通过管理员工作)。有什么好办法处理这个问题吗?最好显示正确的列表(所有活动的ModelB),然后只包括当前选择的ModelB,即使它是非活动的 您可以将formf
但是,如果我修改一个引用非活动ModelB的旧ModelA,则非活动ModelB不会显示在列表中。所以我无法保存信息(现在,我正在通过管理员工作)。有什么好办法处理这个问题吗?最好显示正确的列表(所有活动的ModelB),然后只包括当前选择的ModelB,即使它是非活动的 您可以将
formfield\u用于\u foreignkey
from
您必须将当前对象值附加到kwargs[“queryset”]中的
Q
。您可以从
您必须将当前对象值附加到kwargs[“queryset”]中的
Q
。这将满足您的需要。基本上,它会检查表单是否在现有ModelA对象上呈现,如果是,则会更改ModelB字段的queryset以过滤所有活动的ModelB对象以及当前分配的对象
class ModelAAdminForm(forms.ModelForm):
class Meta:
model = ModelA
def __init__(self, *args, **kwargs):
super(ModelAAdminForm, self).__init__(*args, **kwargs)
if self.instance.id and self.instance.modelb:
q = Q(active=True)| Q(id=self.instance.modelb.id)
self.fields['modelb'].queryset = ModelB.objects.filter(q)
else:
self.fields['modelb'].queryset = ModelB.objects.filter(active=True)
class ModelAAdmin(admin.ModelAdmin):
form = ModelAAdminForm
这会满足你的要求。基本上,它会检查表单是否在现有ModelA对象上呈现,如果是,则会更改ModelB字段的queryset以过滤所有活动的ModelB对象以及当前分配的对象
class ModelAAdminForm(forms.ModelForm):
class Meta:
model = ModelA
def __init__(self, *args, **kwargs):
super(ModelAAdminForm, self).__init__(*args, **kwargs)
if self.instance.id and self.instance.modelb:
q = Q(active=True)| Q(id=self.instance.modelb.id)
self.fields['modelb'].queryset = ModelB.objects.filter(q)
else:
self.fields['modelb'].queryset = ModelB.objects.filter(active=True)
class ModelAAdmin(admin.ModelAdmin):
form = ModelAAdminForm