Django 管理员,如何在 StackedInline 记录中添加 FK 选择器

问题描述 投票:0回答:1

给定以下模型:

class Person(models.Model):
    name = models.CharField(max_length=50)
    family = models.ForeignKey(
        "Family", related_name="members", on_delete=models.CASCADE
    )

    def __str__(self) -> str:
        return self.name


class Family(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self) -> str:
        return self.name

以及以下管理设置:

class PersonAdmin(admin.StackedInline):
    model = Person
    list_display = ("name", "family")

    extra = 0


class FamilyAdmin(admin.ModelAdmin):
    model = Family
    list_display = ("name",)

    inlines = [PersonAdmin]

    extra = 0


admin.site.register(Family, FamilyAdmin)

我希望能够从“家庭”编辑页面更改一个人的家庭。
假设我有 Person A 属于 Family 1,我希望能够从家庭编辑页面将此人“迁移”到另一个家庭。

不幸的是,即使我在 PersonAdmin 类中明确指定字段,下拉列表也不会显示。

任何帮助,甚至是知道在哪里和看什么的简单提示,将不胜感激。

我已经尝试在 Django Admin Cookbook、Google 和 SO 上寻找解决方案,但还没有找到解决方案,我几乎是一个 django(管理员)菜鸟。

python django django-models foreign-keys django-admin
1个回答
0
投票

您可以将自定义

form
添加到
PersonAdmin
类并覆盖
__init__()
方法以动态添加
ModelChoiceField
用于选择一个人的新家庭。

试试这个:


from django import forms
from django.contrib import admin

from .models import Family, Person


class PersonForm(forms.ModelForm):
    new_family = forms.ModelChoiceField(
        queryset=Family.objects.all(),
        required=True,
        label="New Family",
    )

    class Meta:
        model = Person
        fields = ["name", "family", "new_family"]


class PersonAdmin(admin.StackedInline):
    model = Person
    list_display = ("name", "family")
    extra = 0
    form = PersonForm  # Here we Added custom form


class FamilyAdmin(admin.ModelAdmin):
    model = Family
    list_display = ("name",)
    inlines = [PersonAdmin]
    extra = 0


admin.site.register(Family, FamilyAdmin)
© www.soinside.com 2019 - 2024. All rights reserved.