如何覆盖 Django admin/form 使用的外键查询集

MDa*_*alt 5 django django-admin django-validation

我已经尝试了在互联网上可以找到的所有内容,但似乎没有任何效果,所以想知道以前的许多答案是否适用于旧版本。我使用的是 Django 2.2.9。

#models.py

class ParentModel(models.Model):
   title = models.CharField()

class ChildModel(models.Model):
   parent = models.ForeignKey(
        ParentModel,
        on_delete=models.CASCADE,
        related_name='parent'
    )

Run Code Online (Sandbox Code Playgroud)
# admin.py

@admin.register(ParentModel)
class ParentModelAdmin(admin.ModelAdmin):
    model = ParentModel

    def get_queryset(self, request):
        return ParentModel.objects.get_complete_queryset()


class ChildModelForm(forms.Form):
    def __init__(self, u, *args, **kwargs):
        super(ChildModelForm, self).__init__(*args, **kwargs)
        self.fields['parent'].queryset = ParentModel.objects.get_complete_queryset()

    class Meta:
        model = ChildModel
        fields = '__all__'


@admin.register(ChildModel)
class ChildModelAdmin(admin.ModelAdmin):
   model = ChildModel
   form = ChildModelForm

   def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "parent":
            kwargs["queryset"] = ParentModel.objects.get_complete_queryset()

        return super().formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

get_complete_queryset我调用了一个经理查询,ParentModel它返回比默认值更广泛的 Parent 集合queryset

上面的设置允许我转到我的ChildModelAdmin并从下拉列表中选择“隐藏”父母,但是当我尝试保存时,它给了我这个错误:

parent instance with id 2 does not exist.

表单必须使用一些查询集来保存未被覆盖的模型,但我找不到它是什么。

小智 4

您可以像这样重写 get_form 方法:

def get_form(self, request, obj, **kwargs):
        form = super(<YourModelAdmin>,self).get_form(request, obj, **kwargs)
        form.base_fields['<you_field>'] = forms.ModelChoiceField(queryset=<your_queryset>)
        return form
Run Code Online (Sandbox Code Playgroud)