gpt4 book ai didi

Django Admin基于另一个字段过滤ForeignKey下拉列表

转载 作者:行者123 更新时间:2023-12-03 13:32:20 25 4
gpt4 key购买 nike

我有 3 个模型:

class FileType(models.Model):
name=models.CharField(max_length=128)

class ManagedFile(models.Model):
type = models.ForeignKey(FileType)
content = models.FileField(upload_to=path_maker)

class Tag(models.Model):
type = models.ForeignKey(FileType)
m_file = models.ForeignKey(ManagedFile)

def clean(self):
if self.m_file is None:
return
if self.type != self.m_file.type:
raise ValidationError("File type does not match Tag type")

当为标签选择 m_file 时,m_files 类型必须与标签类型匹配。这一切都很好,但是 Tag.m_file 的管理下拉菜单会显示所有类型的文件,而不管标签的类型如何。这让用户感到困惑。

在我看来,有很多方法可以静态过滤下拉列表。所以如果我想说我们永远不会让用户在下拉列表中看到 Type.pk=1,我可以做到。但似乎没有办法过滤 m_file.Type == Self.Type

最佳答案

动态创建管理表单类实际上非常容易。这样的事情应该工作:

def tagform_factory(filetype):
class TagForm(forms.ModelForm):
m_file = forms.ModelChoiceField(
queryset=ManagedFile.objects.filter(type=filetype)
)
return TagForm


class TagAdmin(admin.ModelAdmin):

def get_form(self, request, obj=None, **kwargs):
if obj is not None and obj.type is not None:
kwargs['form'] = tagform_factory(obj.type)
return super(TagAdmin, self).get_form(request, obj, **kwargs)

请注意, get_form 方法负责构建表单类,而不是表单实例。它的名字很糟糕,恕我直言。

但是,您仍然需要决定如何处理用于添加新标签而不是编辑现有标签的表单。在这种情况下,您还没有可以限制下拉列表的类型。也许这里实际上潜伏着数据建模问题?你真的需要 type 模型上的 Tag 字段吗?也许它应该被删除?

关于Django Admin基于另一个字段过滤ForeignKey下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23664518/

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