【问题标题】:Set model field choices attribute at run time?在运行时设置模型字段选择属性?
【发布时间】:2010-03-05 17:51:42
【问题描述】:

有什么简单的方法吗?

【问题讨论】:

  • 出于好奇,您对此有何用例?
  • 我正在尝试从数据库中提取选择列表。我也在使用翻译,我无法标记要翻译的字符串,因为它们在数据库中。
  • 这些选择是向用户公开还是仅用于内部逻辑?我想知道这是否可以在表单级别处理,因为在那里动态构建选择更为常见。在模型级别更改选择似乎违背了首先在模型上设置选择的目的。也许可以用不同的方式来解决这个问题?

标签: django django-models


【解决方案1】:

您可以将选项属性设置为任何可迭代对象: http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.choices

我自己没有对此进行测试,所以我不确定实际评估选择属性的时间,但您可以分配一个生成器函数来计算您想要的选择。

您也可以使用 Model post_init 信号进行调查:http://docs.djangoproject.com/en/1.1/ref/signals/#post-init

这将使您在 Django 初始化模型后访问您的模型,因此您可以在那时设置选项。您可能希望像这样通过“_meta”界面:

instance._meta.get_field_by_name('FIELD_NAME')[0].choices = [<choices>...]

【讨论】:

  • 这几乎奏效了。我可以看到当前的选择,但如果我尝试将其设置为不同的值,我会收到错误:AttributeError: can't set attribute.
  • 在字段源中四处寻找,您可以看到“choices”是一个只读属性:code.djangoproject.com/browser/django/tags/releases/1.1.1/… 尝试设置为“_choices”。这在 shell 中有效,但我不会对意外后果做出任何保证。
  • 用这个方法发现了一个大问题。更改时的选择属性会更改整个服务器的模型,这意味着以后的请求将具有新的选择值。
  • 对 - 这将本质上改变模型定义。回溯,如果您在模型实例本身上设置 _choices 是否有效? YourModel.yourfield._choices = [...]
  • 这个问题有两个部分:表单和模型级别。表单级别实现起来非常简单,在显示条目的查看/编辑页面时使用。模型级别更复杂,仅在显示列出每个条目及其某些属性的表格时使用。这就是为什么此解决方案不适用于这种特殊情况的原因。我通过使用调用检索正确显示名称的类方法的模板标记采取了另一种方法。无论如何,谢谢。
【解决方案2】:

设置选项in __init__()

【讨论】:

  • 对不起,我不清楚。我的意思是在模型初始化后设置/更改选择属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
相关资源
最近更新 更多