Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django中限制外键中的选项,但始终包含当前值?_Django_Django Models_Django Forms_Django Admin - Fatal编程技术网

如何在Django中限制外键中的选项,但始终包含当前值?

如何在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

我在这里使用了这种方法:

将ModelA中外键的选择限制为ModelB中设置为“活动”的条目。这样,我就可以在ModelB条目过时时停用它们。然后,当用户进入新的ModelA时,只显示活动的ModelB条目


但是,如果我修改一个引用非活动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