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小部件,但这是旁边的.)
这可能最终成为这些限制之一。这就是我想出的办法。可以创建自定义表单并将其传递到管理站点以用于呈现页面。然而,我无法得到的是它正确显示初始值。也许更擅长表单的人可以提供一些我不知道的 uber-cool-secret-meta API 并解决这个问题。
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)
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)
| 归档时间: |
|
| 查看次数: |
7094 次 |
| 最近记录: |