Django ModelChoiceField - 使用除id以外的东西?

RS7*_*RS7 10 python django validation django-forms django-validation

假设我有一个address表,它有一个postal_code字段 - ModelChoiceField不允许我使用PK以外的东西来验证存在是否正确?怎么走?正常输入和使用clean_*()

pal*_*luh 23

怎么样to_field_name?我不确定它是否记录在任何地方,但您可以在ModelChoiceField构造函数参数之间轻松找到它:https://github.com/django/django/blob/master/django/forms/models.py.它用于过滤字段查询集.

例如:

articles = ModelChoiceField(queryset=Articles.objects.all(),
        to_field_name='slug')
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在1.4(尚未尝试1.5,抱歉)它与`instance`参数一起使用时会被破坏,因为`model_to_dict`强行使用PK(实际上是`value_for_object`).要解决一个问题,必须做`YourForm(...,instance = foo,initial = {"bar":foo.bar.slug})`.有关详细信息,请参阅`BaseModelForm .__ init__`实现. (2认同)

Joh*_*ohn 1

ModelChoiceFields 旨在用于在现有模型实例的选择之间进行选择。这几乎总是最好地由某种形式的选择字段来表示。

也就是说,正如您所暗示的那样,您真的有从地址到邮政编码的外键吗?您在邮政编码表中存储什么来证明每个地址相关查询都需要加入额外的表?

对于大多数情况,postal_code 应该只是一个 CharField,在这种情况下,如果您想验证该值是否有效,您可以将该choices属性与有效邮政编码列表一起使用。请记住,手动维护有效邮政编码列表是一个巨大的麻烦。

如果您确实有一个 PostalCode 表并认为这是一个好主意(在某些情况下可能是),您可能需要考虑实际使用 postal_code 作为主键而不是默认的自动增量,因为它必然是唯一的,使您的数据更可导出,并通过验证解决您的问题。