在阅读了几个小时的半相关问题后,我终于弄明白了。
您不能按照我尝试的方式自行引用模型,因此无法使用 limit_choices_to 使 django 以我想要的方式运行,因为它无法在同一模型中找到不同 ForeignKey 的 id。
如果您更改 django 的工作方式,显然可以做到这一点,但解决此问题的更简单方法是更改 admin.py。
这是我的 models.py 现在的样子:
# models.py
class MovieCategory(models.Model):
category = models.ForeignKey(Category)
movie = models.ForeignKey(Movie)
prefix = models.ForeignKey('Prefix', blank=True, null=True)
number = models.DecimalField(verbose_name='Movie Number', max_digits=2,
blank=True, null=True, decimal_places=0)
我只是完全删除了limit_choices_to。
我在 Kyle Duncan 发布的解决方案中发现了类似的问题 here。
不同之处在于它使用了 ManyToMany 而不是 ForeignKey。这意味着我必须在我的班级 MovieCategoryAdmin(admin.ModelAdmin): 下删除 filter_horizontal = ('prefix',),因为这仅适用于 ManyToMany 字段。
在 admin.py 中,我必须在顶部添加 from django import forms 才能创建表单。
这是表单的外观:
class MovieCategoryForm(forms.ModelForm):
class Meta:
model = MovieCategory
fields = ['prefix']
def __init__(self, *args, **kwargs):
super(MovieCategoryForm, self).__init__(*args, **kwargs)
self.fields['prefix'].queryset = Prefix.objects.filter(
category_id=self.instance.category.id)
还有我的 AdminModel:
class MovieCategoryAdmin(admin.ModelAdmin):
"""
Admin Class for 'Movie Category'.
"""
fieldsets = [
('Category', {'fields': ['category']}),
('Movie', {'fields': ['movie']}),
('Prefix', {'fields': ['prefix']}),
('Number', {'fields': ['number']}),
]
list_display = ('category', 'movie', 'prefix', 'number')
search_fields = ['category__category_name', 'movie__title', 'prefix__prefix']
form = MovieCategoryForm
这正是 Kyle 在他的回答中描述的方式,除了我必须在表单中添加 fields = ['prefix'] 否则它不会运行。如果您按照他的步骤操作并记住删除 filter_horizontal 并添加您正在使用的字段,它应该可以工作。
编辑:此解决方案在编辑时工作正常,但在创建新条目时却不行,因为当一个不退出时它无法搜索类别 ID。我正在想办法解决这个问题。