Django管理员可以通过related_name处理一对多的关系吗?

Mat*_*Mat 11 django django-models django-forms django-admin

Django管理员通过HTML <SELECT>表单字段愉快地支持多对一和多对多关系,允许分别选择一个或多个选项.甚至还有一个很好的Javascript filter_horizontal小部件可以提供帮助.

我试图通过related_name从一对多方面做同样的事情.我不知道它与多对多有什么不同,只要在表单中显示它,我只需要一个多选SELECT列表.但我不能简单地将related_name值添加到我的 - ModelAdmin派生字段列表中.

Django是否以这种方式支持一对多字段?

我的Django模型是这样的(设计简化示例):

class Person(models.Model):
    ...
    manager = models.ForeignKey('self', related_name='staff',
                                null=True, blank=True, )
Run Code Online (Sandbox Code Playgroud)

在人员管理页面中,我可以轻松获得一个<SELECT>列表,显示所有可能的员工从中选择人的经理.我还想显示所有经理员工的多选<SELECT>列表.

我不想使用内联,因为我不想编辑下属的细节; 我确实希望能够从列表中添加/删除人员.

(我正在尝试使用django-ajax-choices来替换SELECT小部件,但这是旁边的.)

T. *_*one 0

这可能最终成为这些限制之一。这就是我想出的办法。可以创建自定义表单并将其传递到管理站点以用于呈现页面。然而,我无法得到的是它正确显示初始值。也许更擅长表单的人可以提供一些我不知道的 uber-cool-secret-meta API 并解决这个问题。

模型.py

class Person(models.Model):
    # ...
    manager = models.ForeignKey('self', related_name='staff', null=True, blank=True)

    def manager_staff(self):
        return self.manager.staff.all()
Run Code Online (Sandbox Code Playgroud)

管理员.py

class PersonAdminForm(forms.ModelForm):    
    manager_staff = forms.ModelMultipleChoiceField(
                        initial='manager_staff',       # Can't get this to work
                        queryset=Person.objects.all(),
                        required=False,
                        )

    class Meta:
        model = Person

class PersonAdmin(admin.ModelAdmin):    
    form = PersonAdminForm

    def save_model(self, request, obj, form, change):
        for id in form.data.getlist('manager_staff'):
            # This is kind of a weak way to do this, but you get the idea...
            p = Person.objects.get(id=id)
            p.manager = obj.manager
            p.save()

        super(PersonAdmin, self).save_model(request, obj, form, change)

admin.site.register(Person, PersonAdmin)
Run Code Online (Sandbox Code Playgroud)