0

我在这里使用了这种方法:https ://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to

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

但是,如果我去修改一个旧的 ModelA,它引用了一个非活动的 ModelB,非活动的 ModelB 不会出现在列表中。所以我无法保存信息(现在,我正在通过管理员工作)。有没有好的方法来处理这个?最好显示正确的列表(所有活动的 ModelB),然后只包括当前选择的 ModelB,即使它是非活动的。

4

2 回答 2

3

这将做你想要的。基本上,它会检查表单是否正在现有的 ModelA 对象上呈现,如果是,它会更改 ModelB 字段的查询集以过滤所有活动的 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
于 2013-07-02T17:36:38.957 回答
2

您可以formfield_for_foreignkey使用https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

您必须将当前对象值附加到Qkwargs["queryset"] 中。

于 2012-07-28T22:17:59.853 回答