Django ForeignKey limit_choices_to一个不同的ForeignKey ID
我正在尝试使用limit_choices_to限制ForeignKey的Django Admin选择,但是我不知道如何正确地做到这一点。
如果类别ID为16,此代码可以实现我想要的功能,但是我无法弄清楚如何使用当前类别ID,而不是对其进行硬编码。
class MovieCategory(models.Model):
category = models.ForeignKey(Category)
movie = models.ForeignKey(Movie)
prefix = models.ForeignKey('Prefix', limit_choices_to={'category_id': '16'},
blank=True, null=True)
number = models.DecimalField(verbose_name='Movie Number', max_digits=2,
blank=True, null=True, decimal_places=0)
是否可以某种方式引用类别ForeignKey的ID?
-
经过数小时的阅读半相关的问题,我终于弄明白了。
您无法以我尝试的方式自我引用模型,因此无法通过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)发布的解决方案类似的问题。不过,不同之处在于,它使用的是ManyToMany而不是ForeignKey。这意味着我必须filter_horizontal = ('prefix',)
在班级下删除,MovieCategoryAdmin(admin.ModelAdmin):
因为这仅适用于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。我正在尝试找出解决方法。