[英]Specify Django proxy model in admin foreign key
In Django 1.11, I have a model Friend
, and a proxy model Relative
: 在Django 1.11中,我有一个
Friend
模型和一个Relative
代理模型:
class FriendManager(models.Manager):
def get_queryset(self):
return super(RelativeManager, self).get_queryset().filter(is_relative=False)
class Friend(models.Model):
# Model fields defined here
objects = FriendManager()
class RelativeManager(models.Manager):
def get_queryset(self):
return super(RelativeManager, self).get_queryset().filter(is_relative=True)
class Relative(Friend):
class Meta:
proxy = True
objects = RelativeManager()
def save(self, *args, **kwargs):
self.is_relative = True
super(Relative, self).save(*args, **kwargs)
I also have a model FriendPortrait
, which has a foreign key field friend
: 我也有一个模型
FriendPortrait
,它有一个外键字段friend
:
class FriendPortrait(models.Model):
friend = models.ForeignKey(Friend)
And a proxy on that: 还有一个代理:
class RelativePortrait(FriendPortrait):
class Meta:
proxy = True
Now, I want the detail view for RelativePortraits to only show relatives in the drop-down for friend
. 现在,我希望RelativePortraits的详细视图仅在
friend
的下拉列表中显示亲戚。
admin.py: admin.py:
@admin.register(RelativePortrait)
class RelativePortraitAdmin(admin.ModelAdmin):
fields = ('friend')
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'friend':
kwargs['queryset'] = Relative.objects.all()
return super(RelativePortraitAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
This works, in that only relatives are displayed in the friend
drop-down. 之所以有效,是因为在
friend
下拉列表中仅显示亲戚。 However, when I try to save a portrait, Django admin gives me a validation error: 但是,当我尝试保存肖像时,Django管理员给了我一个验证错误:
friend instance with id 14 does not exist.
ID为14的好友实例不存在。
How can I specify that I want to use a proxy model for my foreign key in the RelativePortraitAdmin
? 如何在
RelativePortraitAdmin
指定要对我的外键使用代理模型?
The problem here is that your ForeignKey
points to the Friend
model. 这里的问题是您的
ForeignKey
指向Friend
模型。 The model's default manager filters out all relatives, so this will not work. 模型的默认管理员会过滤掉所有亲戚,因此这将不起作用。
A simple way to solve this would be to restructure your models a bit. 解决此问题的简单方法是稍微重构模型。 Introducing something like a generic
Person
model and having Friend
and Relative
inherit from it with proxy=True
. 引入诸如通用
Person
模型之类的内容,并使用proxy=True
从其继承Friend
和Relative
。 The Person
model shouldn't have a manager that pre-filters the instances; Person
模型不应该具有预先过滤实例的管理器; then you could have your ForeignKey
point to person. 那么您可以将
ForeignKey
指向某人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.