给定以下模型:
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(管理员)菜鸟。
您可以将自定义
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)