我正在使用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')
我希望django管理员在我选择default_version时限制下拉,以便我只能选择那些拥有当前平台的版本。
例如,如果我的版本名为'1.1',其平台joomla和版本'1.2',其中wordpress为平台
因此,当我在wordpress的管理员中选择default_version下拉列表时,我希望在下拉列表中仅显示我的版本“1.2”。现在它向我展示了所有版本。
我正在尝试将limit_choices_to限制为here 所以我试试这个:
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的内容,我尝试自我,但它不起作用 我也试过了
limit_choices_to={'platform.name':name}
我也没有工作。
在这个例子中,我希望能够选择一个喜欢的孩子,但问题是管理员会给我所有的孩子可供选择,而不仅仅是我正在编辑的父母的子女。
答案 0 :(得分:2)
您可以尝试formfield_for_foreignkey:
class PlatformAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "default_version":
kwargs["queryset"] = Version.objects.filter(platform=self.instance.pk)
return super(PlatformAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
答案 1 :(得分:2)
我找到了基于Django: accessing the model instance from within ModelAdmin?
的解决方案添加到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
答案 2 :(得分:0)
这里的问题已经发生了变化。当你在谈论根据选择的平台进行适应的版本选项时,你谈论的是AJAX。您需要做的就是创建一个接受平台作为参数的视图,并返回JSON格式的版本列表。
然后,您将一个hander附加到平台选择框的onchange事件,该事件将通过AJAX获取该视图并使用JSON响应为版本选择框构建一组新选项。用新的和你的完成替换旧的选项。
本网站和网络上有很多例子。