Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何限制django中的外键_Django_Orm_Foreign Keys_Admin - Fatal编程技术网

如何限制django中的外键

如何限制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

我正在使用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 = 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更改选择的能力没有任何影响。