首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用django admin进行一对多内联选择

使用django admin进行一对多内联选择
EN

Stack Overflow用户
提问于 2011-05-18 00:26:40
回答 7查看 34.2K关注 0票数 68

我建立了一个标准的多对一关系。这里有很多字段,但出于我们的目的,相关的模型是:

代码语言:javascript
运行
复制
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

我创建了一个管理员,它工作得很好。当我编辑一个学生时,它甚至可以自动为我设置类。然而,当我去创建/编辑一个类时,我得到的只是一个名称的输入框。

有没有办法添加一个框/字段,以便学生可以从班级管理页面添加为班级成员?我可以创建一个内联表单,但那是为了创建新的学生。我已经创建了我的所有学生,只是寻找一个快速的方法来添加多个现有的学生到不同的班级。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-01-11 20:01:20

这是Luke Sneeringer建议的“自定义表单”解决方案。无论如何,我很惊讶这个问题没有现成的Django解决方案(相当自然,可能也很常见)。我是不是遗漏了什么?

代码语言:javascript
运行
复制
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
票数 42
EN

Stack Overflow用户

发布于 2011-05-18 00:28:28

的确有!你想要InlineModelAdmin (see InlineModelAdmin documentation here)

简单的示例代码:

代码语言:javascript
运行
复制
class StudentAdminInline(admin.TabularInline):
    model = Student

class ClassAdmin(admin.ModelAdmin):
    inlines = (StudentAdminInline, )
admin.site.register(Class, ClassAdmin)
票数 50
EN

Stack Overflow用户

发布于 2019-11-10 02:43:25

这可能会有所帮助:我使用了所描述的方法,但以以下方式更改了方法savesave_m2m

代码语言:javascript
运行
复制
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 = FooForm
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6034047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档