如何限制django中的外键
我正在使用django 1.2 我有两个模型 编辑:我刚刚找到了一个更好的例子:如何限制django中的外键,django,orm,foreign-keys,admin,Django,Orm,Foreign Keys,Admin,我正在使用django 1.2 我有两个模型 编辑:我刚刚找到了一个更好的例子: class Parent(models.Model): name = models.CharField(max_length=255) favorite_child = models.ForeignKey(Child) class Child(models.Model): name = models.CharField(max_length=255) myparent = mode
class Parent(models.Model):
name = models.CharField(max_length=255)
favorite_child = models.ForeignKey(Child)
class Child(models.Model):
name = models.CharField(max_length=255)
myparent = models.ForeignKey(Parent)
class Version(models.Model):
name = models.CharField(max_length = 255)
platform = models.ForeignKey("Platform",related_name='version_platform')
class Platform(models.Model):
name = models.CharField(max_length = 255)
default_version = models.ForeignKey(Version,related_name='platform_default_version')
在这个例子中,我希望能够选择一个最喜欢的孩子,但问题是管理员会给我所有的孩子来选择,而不仅仅是那些我目前正在编辑的家长的孩子
原始示例:
class Parent(models.Model):
name = models.CharField(max_length=255)
favorite_child = models.ForeignKey(Child)
class Child(models.Model):
name = models.CharField(max_length=255)
myparent = models.ForeignKey(Parent)
class Version(models.Model):
name = models.CharField(max_length = 255)
platform = models.ForeignKey("Platform",related_name='version_platform')
class Platform(models.Model):
name = models.CharField(max_length = 255)
default_version = models.ForeignKey(Version,related_name='platform_default_version')
我希望django管理员在选择默认版本时限制下拉列表,以便我只能选择具有当前平台的版本。例如,如果我有一个名为“1.1”的版本,其中有平台joomla,而版本“1.2”中有wordpress作为平台。
因此,当我在wordpress的管理中选择default_version下拉列表时,我希望它在下拉列表中只显示我的版本“1.2”。现在它向我展示了所有的版本 我正试图限制您的选择,如图所示 所以我试着这样做:
class Platform(models.Model):
name = models.CharField(max_length = 255)
default_version = models.ForeignKey(Version,limit_choices_to={'platform':XXXXX},related_name='platform_default_version')
但我不知道该用什么来代替XXXX,我试着用self,但它不起作用。我也试过了
limit_choices_to={'platform.name':name}
我也没有工作
在本例中,我希望能够选择一个最喜欢的孩子,但问题是管理员会给我所有的孩子来选择,而不仅仅是我当前编辑的家长的孩子。您可以尝试:
你可以试试:
这里的问题已经扭曲了。当您谈论基于选择哪个平台的版本选项时,您谈论的是AJAX。您只需创建一个视图,该视图接受平台作为参数,并返回JSON格式的版本列表 然后,将hander附加到平台选择框的onchange事件,该事件将通过AJAX获取该视图,并使用JSON响应为版本选择框构造一组新的选项。将旧选项替换为新选项,并完成
这个网站和整个网络上都有大量的例子。这里的问题已经被歪曲了。当您谈论基于选择哪个平台的版本选项时,您谈论的是AJAX。您只需创建一个视图,该视图接受平台作为参数,并返回JSON格式的版本列表 然后,将hander附加到平台选择框的onchange事件,该事件将通过AJAX获取该视图,并使用JSON响应为版本选择框构造一组新的选项。将旧选项替换为新选项,并完成
这个网站和整个网络上都有很多例子。我找到了一个基于 添加到admin.py 解决方案:
class ParentForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ParentForm, self).__init__(*args, **kwargs)
self.fields['favorite_child'].queryset = \
Child.objects.filter(parent=self.instance.pk)
class ParentAdmin(admin.ModelAdmin):
form = ParentForm
我找到了一个基于 添加到admin.py 解决方案:
class ParentForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ParentForm, self).__init__(*args, **kwargs)
self.fields['favorite_child'].queryset = \
Child.objects.filter(parent=self.instance.pk)
class ParentAdmin(admin.ModelAdmin):
form = ParentForm
限制选项不适用于动态值,我不确定这是否有助于您的案例,因为我猜这是在添加一个新平台而不是编辑?关于第二个示例,您希望为您的孩子提供一个
收藏夹
布尔字段,然后你可以一起使用unique\u
。但是我可以选择两个我最喜欢的孩子,这会给错误留下空间。将选择限制到与动态值无关,我不确定这是否会对你的情况有所帮助,因为我猜这是关于添加新平台而不是编辑?关于第二个示例,您希望为您的孩子设置一个收藏夹
布尔字段,然后您将一起使用unique\u
。但这样我就可以选择两个最喜欢的孩子,这会为错误留出空间。但我应该用什么来代替XXXX呢,不是字符串用动态值替换字符串。动态值是我当前编辑的平台,它是一个对象。我尝试使用self。我想它应该是self.instance.pk,但我应该用什么来代替XXXX呢,不是字符串用动态值替换字符串。动态值是我当前编辑的平台,它是一个对象。我试过使用self。我想它应该是self.instance.pki。我说的是django管理员,如果我自己做查看,我就不会有这个问题,顺便说一句,即使没有使用客户端。我理解为他想限制平台的change_view页面上的Version下拉菜单中的值。问题是限制Django中的Version下拉菜单本身会导致问题,如果平台发生更改。如果您切换平台,您仍然只能选择旧平台,更糟糕的是,即使您实现AJAX来更新版本选择,它也无法验证,因为它仅限于旧平台拥有的版本。您需要原封不动地传递所有可能的版本列表,然后使用AJAX进行过滤,以覆盖所有使用场景@yossi:事实上,这在管理员中对使用AJAX改变选择的能力没有任何影响。我说的是django管理员,如果我自己做这个视图,我就不会有这个问题,顺便说一句,即使没有使用客户端。我理解为他想限制平台的change_view页面上的Version下拉菜单中的值。问题是限制Django中的Version下拉菜单本身会导致问题,如果平台发生更改。如果您切换平台,您仍然只能选择旧平台,更糟糕的是,即使您实现AJAX来更新版本选择,它也无法验证,因为它仅限于旧平台拥有的版本。您需要原封不动地传递所有可能的版本列表,然后使用AJAX进行过滤,以覆盖所有使用场景@yossi:事实上,这在管理中对使用AJAX更改选择的能力没有任何影响。