使用Django管理员进行一对多内联选择
我建立了标准的多对一关系。有很多字段,但是出于我们的目的,相关模型为:
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
我创建了一个管理员,效果很好。当我编辑学生时,它甚至可以自动设置班级。但是,当我去创建/编辑一个类时,我得到的只是名称输入框。
是否可以添加一个框/字段,以便在班级管理页面中将学生添加为班级成员?我可以内联表单,但这就是创建新学生。我已经创建了所有学生,并且正在寻找一种快速方法来将多个现有学生添加到不同的班级。
回答:
这是Luke Sneeringer建议的“自定义表单”解决方案。无论如何,我对缺少这个问题(相当自然且可能很常见)的现成Django解决方案感到惊讶。我想念什么吗?
from django import formsfrom 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
以上是 使用Django管理员进行一对多内联选择 的全部内容, 来源链接: utcz.com/qa/412295.html