gpt4 book ai didi

python - Django ForeignKey limit_choices_to 一个不同的 ForeignKey id

转载 作者:太空狗 更新时间:2023-10-29 18:24:15 27 4
gpt4 key购买 nike

我正在尝试使用 limit_choices_to 来限制 Django 管理员对 ForeignKey 的选择,但我不知道如何正确地做到这一点。

如果类别 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。我发现了类似的问题here使用 Kyle Duncan 发布的解决方案。不同之处在于,它使用 ManyToMany 而不是 ForeignKey。这意味着我必须删除类 MovieCategoryAdmin(admin.ModelAdmin): 下的 filter_horizo​​ntal = ('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_horizo​​ntal 并添加您正在使用的字段,它应该可以工作。

编辑:此解决方案在编辑时效果很好,但在创建新条目时效果不佳,因为它无法在不退出时搜索类别 ID。我正在想办法解决这个问题。

关于python - Django ForeignKey limit_choices_to 一个不同的 ForeignKey id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578559/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com