一对多内联select与Django的pipe理员

我有一个标准的多对一的关系设置。 有很多领域,但是对于我们来说,相关的模型是:

class Class(models.Model): name = models.CharField(max_length=128) class Student(models.Model): class = models.ForeignKey(Class) name = models.CharField(max_length=128) address = models.CharField(max_length=128) # ...etc 

我创build了一个pipe理员,而且效果很好。 甚至当我编辑一个学生时,它甚至可以自动设置课程。 但是,当我去创build/编辑一个类,我得到的是名称的input框。

有没有一种方法来添加一个框可以添加学生作为类的成员从class级pipe理页面? 我可以内联表格,但是这是创build新的学生。 我已经创build了所有我的学生,只是寻找一种快速的方法,将多个现有的学生添加到不同的课程“。

正如卢克·斯内林格(Luke Sneeringer)所言,这就是“自定义forms”的解决scheme 无论如何,我惊讶于这个(相当自然的,可能是常见的)问题,缺less开箱即用的Django解决scheme。 我错过了什么吗?

 from django import forms from django.db import models from django.contrib import admin class Foo(models.Model): pass class 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 instance class FooAdmin(admin.ModelAdmin): form = FooForm 

有! 您需要InlineModelAdmin (请参阅InlineModelAdmin文档)

示例代码简要说明:

 class StudentAdminInline(admin.TabularInline): model = Student class ClassAdmin(admin.ModelAdmin): inlines = (StudentAdminInline, ) admin.site.register(Class, ClassAdmin)