【问题标题】:Django Form ChoiceField range(): 'int' object not iterableDjango Form ChoiceField range(): 'int' object not iterable
【发布时间】:2011-12-22 22:48:41
【问题描述】:
from django import forms

class SignUpForm(forms.Form):
    birth_day = forms.ChoiceField(choices=range(1,32))

我收到“渲染时捕获类型错误:'int' 对象不可迭代”。 https://docs.djangoproject.com/en/dev/ref/models/fields/#field-choices 表示选择参数采用可迭代对象,例如列表或元组。

http://docs.python.org/library/functions.html#range 说 range() 创建一个列表。

为什么会出现错误?

我尝试使用 map() 将列表转换为 str,但收到不同的错误。

【问题讨论】:

    标签: django forms range choicefield


    【解决方案1】:

    你需要 2 个元组。对相同的 2 个元组使用 zip 内置函数

    from django import forms
    
    
    class SignUpForm(forms.Form):
    
        birth_day = models.IntegerField(choices=list(zip(range(1, 32), range(1, 32))), unique=True)
    

    记住 (1,32) 将创建从 1 到 31 !

    【讨论】:

      【解决方案2】:

      ... 表示选择参数采用列表或元组等可迭代对象。

      不,它说它需要一个可迭代的 2 元组

      一个可迭代(例如,列表或元组)的 2 元组,用作该字段的选择。

      birth_day = forms.ChoiceField(choices=((str(x), x) for x in range(1,32)))
      

      【讨论】:

      • 有效,看来我在阅读时需要小心。解决方案有一个额外的左括号需要删除。
      • @IgnacioVazquez-Abrams:您有什么理由使用生成器而不是列表或元组? stackoverflow.com/questions/16940293/…
      • @noisy:主要是习惯的力量,但不需要字节码中的完整数据结构。
      猜你喜欢
      • 2019-04-12
      • 2016-02-18
      • 2022-11-02
      • 2018-06-29
      • 2020-11-07
      • 2016-01-09
      • 2018-12-10
      • 1970-01-01
      • 2022-12-15
      相关资源
      最近更新 更多