I have a standard many-to-one relationship set up. There are a bunch of fields, but for our purposes here, the relevant model is:
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
I created an admin, and it works great. it even automatically has the ability for me to set the Class when I am editing a Student. However, when I go to create/edit a Class, all I get is an input box for the name.
Is there a way to add a box/field where Students can be added as members of Class from the Class admin page? I can make a form inline, but that is to create new Students. I already have all my Students created and am just looking for a quick method to add multiple existing Students to different Class'.
Here is "custom form" solution as Luke Sneeringer suggested. Anyway, I'm suprised by absence of out-of-the-box Django solution to this (rather natural and probably common) problem. Am I missing something?
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
There is! You want
InlineModelAdmin (see InlineModelAdmin documentation here)
Sample code in brief:
class StudentAdminInline(admin.TabularInline): model = Student class ClassAdmin(admin.ModelAdmin): inlines = (StudentAdminInline, ) admin.site.register(Class, ClassAdmin)