【问题标题】:How to access Django's field.choices?如何访问 Django 的 field.choices?
【发布时间】:2012-08-23 08:30:20
【问题描述】:

有没有办法(不使用表单)访问模型字段选择值?

我想做field.choices 之类的操作并在视图或模板中获取值列表。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    当然。只需访问 Model 字段的 choices 属性:

    MyModel._meta.get_field('foo').choices
    my_instance._meta.get_field('foo').choices
    

    【讨论】:

    • 如果我想在我的 django 模板中使用它们怎么办?
    • 视图中可访问的任何内容都可以在模板中访问,您只需将其传递到模板上下文中即可。由于这个以下划线开头,因此您必须手动将字段实例传递给上下文。
    • 如果您在选择中使用命名组,您可能还会发现flatchoices 属性很有用。
    • @Yuji'Tomita'Tomita 怎么转换成json?有什么简单的方法吗?
    【解决方案2】:

    如果你这样声明你的选择:

    class Topic(models.Model):
    
        PRIMARY = 1
        PRIMARY_SECONDARY = 2
        TOPIC_LEVEL = ((PRIMARY, 'Primary'),
                      (PRIMARY_SECONDARY, 'Primary & Secondary'),)
    
        topic_level = models.IntegerField('Topic Level', choices=TOPIC_LEVEL,
                default=1)
    

    这是一个真正的好方法。见:http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/

    然后你可以通过Topic.TOPIC_LEVEL取回选择

    【讨论】:

    • 在我看来,我正在使用这种方式,但我没有得到Primary, Primary & Secondary(在上面的例子中应该是这样),我得到了(PRIMARY, 'Primary'), (PRIMARY_SECONDARY, 'Primary & Secondary')。为什么会这样,如何解决?
    • @LjubisaLivac 原因是您已将变量TOPIC_LEVEL 声明为(database_value, 'readable_value') 对的元组,并且您现在正在完全按照您的输入检索它。这样做有很多好处,其中之一是处理您的代码的下一个人的可读性。这并没有被破坏:许多应用程序宁愿拥有实际的数据库值,而不是人类读取的值。如果您只想要字符串,可以使用[ i[1] for i in Topic.TOPIC_LEVEL ] 检索它们。
    【解决方案3】:

    我认为您正在寻找get_fieldname_display() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2022-11-30
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多