gpt4 book ai didi

python - django admin - 选择反向外键关系(不是创建,我想添加可用)

转载 作者:太空狗 更新时间:2023-10-29 21:05:50 24 4
gpt4 key购买 nike

假设我有一个模型 School 和另一个模型 Student

class Student(models.Model):
school = models.ForeignKey(School)
name = models.CharField(max_length=100)

在管理员中单击学校时,会出现一个新页面,显示学校模型字段和值。

我还想在该页面本身中选择已经可用的学生列表。

Inlines 不同,它们允许创建和编辑属于该学校的新记录(学生)。但我不想那样,假设已经有很多可用的学生记录。我应该能够在该学校模型页面的管理中选择它们。

最佳答案

class SchoolAdminForm(forms.ModelForm):
students = forms.ModelMultipleChoiceField(
queryset=Student.objects.all(),
widget=FilteredSelectMultiple(verbose_name='students', is_stacked=False))

class Meta:
model = School
fields = ['your_school_fields_go_here']

def __init__(self, *args, **kwargs):
super(SchoolAdminForm, self).__init__(*args, **kwargs)
if self.instance:
# fill initial related values
self.fields['students'].initial = self.instance.student_set.all()

class SchoolAdmin(admin.ModelAdmin):
form = SchoolAdminForm

def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
original_students = set(obj.student_set.values_list("id", flat=True))
current_students = set(map(lambda x: x.id, form.cleaned_data['students']))
if original_students != current_students:
add_to_school = current_students - original_students
Student.objects.filter(id__in=add_to_school).update(school_id=obj.id)
remove_from_school = original_students - current_students
Student.objects.filter(id__in=remove_from_school).update(school_id=None)

关于python - django admin - 选择反向外键关系(不是创建,我想添加可用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18505266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com