长话短说,我有一个汽车模型和一个CarVersion模型,我希望用户能够通过html选择字段从数据库中保存的可用汽车版本中进行选择。
我无法理解如何从CarVersion模型动态生成选项字段。我有这个功能,但我不能在汽车模型内部调用它。
这是我迄今为止的代码:
class Car(models.Model):
choices = get_choices()
name = models.CharField(max_length=50, unique=True)
version = models.ForeignKey(CarVersion, choices=get_choices(), on_delete=models.RESTRICT)
@staticmethod
def get_choices():
options = CarVersion.objects.all().values_list("pk", "name")
try:
if not options:
return [(0, "No versions in database. Call your administrator.")]
except ProgrammingError:
return [(0, "No versions in database. Call your administrator.")]
return [(1, "Test")]
我想调用中的函数get_choices
version = models.ForeignKey(CarVersion, choices=get_choices(), on_delete=models.RESTRICT)
但当函数被声明给模型时,我不知道该怎么做。如果我在模型之外定义它,它是有效的,但肯定有一种更好的方法,而不是用一堆特定于模型的函数来扰乱我的models.py文件。
第页。S.get_choices
还没有完成,但只要我能打电话给它,我就会处理它。
出于几个原因,我建议不要这样做。模型字段上的choices
参数用于验证可能添加到数据库中的数据。
除此之外,当加载模块时,获取CarVersion
对象的函数被称为。这是个坏主意。当您甚至还没有数据库连接时,您可能希望在某个地方导入模块。
由于您的目的是为用户生成HTML表单中的选项,因此实现这一点的正确方法是依赖Django表单的外键功能。ModelChoiceField
应该已经满足了您的需求。
PS:事实上,当您从具有ForeignKey
字段的Model创建ModelForm
时,ModelChoiceField
会自动实例化。请参阅ModelForm
页面上的字段转换列表。
我要感谢达尼尔的贡献,因为如果没有他的贡献,我永远无法为我的问题提出正确的问题,那就是:
如何动态生成选项字段。
这个问题的答案可以在:如何创建动态Django选择字段