我建立了一个标准的多对一关系。这里有很多字段,但出于我们的目的,相关的模型是:
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我创建了一个管理员,它工作得很好。当我编辑一个学生时,它甚至可以自动为我设置类。然而,当我去创建/编辑一个类时,我得到的只是一个名称的输入框。
有没有办法添加一个框/字段,以便学生可以从班级管理页面添加为班级成员?我可以创建一个内联表单,但那是为了创建新的学生。我已经创建了我的所有学生,只是寻找一个快速的方法来添加多个现有的学生到不同的班级。
发布于 2012-01-11 20:01:20
这是Luke Sneeringer建议的“自定义表单”解决方案。无论如何,我很惊讶这个问题没有现成的Django解决方案(相当自然,可能也很常见)。我是不是遗漏了什么?
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发布于 2011-05-18 00:28:28
的确有!你想要InlineModelAdmin (see InlineModelAdmin documentation here)
简单的示例代码:
class StudentAdminInline(admin.TabularInline):
model = Student
class ClassAdmin(admin.ModelAdmin):
inlines = (StudentAdminInline, )
admin.site.register(Class, ClassAdmin)发布于 2019-11-10 02:43:25
这可能会有所帮助:我使用了所描述的方法,但以以下方式更改了方法save和save_m2m:
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_m2m(self):
pass
def save(self, *args, **kwargs):
self.fields['bars'].initial.update(foo=None)
foo_instance = Foo()
foo_instance.pk = self.instance.pk
# Copy all other fields.
# ... #
foo_instance.save()
self.cleaned_data['bars'].update(foo=instance)
return instance
class FooAdmin(admin.ModelAdmin):
form = FooFormhttps://stackoverflow.com/questions/6034047
复制相似问题