这是Luke Sneeringer建议的“自定义表单”解决方案。无论如何,我对缺少这个问题(相当自然且可能很常见)的现成Django解决方案感到惊讶。我想念什么吗?
from django import formsfrom django.db import modelsfrom django.contrib import adminclass Foo(models.Model): passclass Bar(models.Model): foo = models.ForeignKey(Foo)class FooForm(forms.ModelForm): class meta: model = Foo bars = forms.ModelMultipleChoiceField(queryset=Bar.objects.all()) def __init__(self, *args, **kwargs): super(FooForm, self).__init__(*args, **kwargs) if self.instance: self.fields['bars'].initial = self.instance.bar_set.all() def save(self, *args, **kwargs): # FIXME: 'commit' argument is not handled # TODO: Wrap reassignments into transaction # NOTE: Previously assigned Foos are silently reset instance = super(FooForm, self).save(commit=False) self.fields['bars'].initial.update(foo=None) self.cleaned_data['bars'].update(foo=instance) return instanceclass FooAdmin(admin.ModelAdmin): form = FooForm



