【问题标题】:cannot set initial value for forms.ChoiceField in django无法在 django 中为 forms.ChoiceField 设置初始值
【发布时间】:2011-07-13 02:05:00
【问题描述】:

大家

我想为 ChoiceField 设置初始值,而该值不在 ChoiceField 的选择中

以下是 ArticleForm 定义:

def ArticleForm(forms.Form):
  choice = forms.ChoiceField(choices=[['a':'a'],['b':'b']])

然后我通过传递初始参数来实例化表单:

form = ArticleForm(initial={'choice':'Portrush'})

注意初始值('Portrush') 不是 ChoiceField('a' and 'b') 中定义的选项之一

如何设置初始值?任何建议表示赞赏。

【问题讨论】:

  • 为什么你不想把它放在选择上?你想让初始值是动态的吗?
  • @sacabuche 是的,我希望初始值是用户配置文件中定义的用户地址

标签: python django django-forms


【解决方案1】:

可能是这样的:

class ArticleForm(forms.Form):
    LETTER_A = 'a'
    LETTER_B = 'b'
    # look not a dict
    CHOICES = ((LETTER_A,'letter a'),
               (LETTER_B,'letter b'))

    choice = forms.ChoiceField(choices=CHOICES)

    def __init__(self, *args, **kwargs):
        initial =  kwargs.get('initial', {})
        choice = initial.get('choice', None)

        # set just the initial value
        # in the real form needs something like this {'choice':'a'}
        # but in this case you want {'choice':('a', 'letter_a')}
        if choice:
            kwargs['initial']['choice'] = choice[0]

        # create the form
        super(ArticleForm, self).__init__(*args, **kwargs)

        # self.fields only exist after, so a double validation is needed
        if  choice and choice[0] not in (c[0] for c in self.CHOICES):
            self.fields['choice'].choices.append(choice)


form = ArticleForm(initial={'choice':('c','other')})
form.as_p()
>>> u'<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice">\n<option value="a">letter a</option>\n<option value="b">letter b</option>\n<option value="c" selected="selected">other</option>\n</select></p>'

【讨论】:

  • @gbstack 很高兴 :),我玩得很开心
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
相关资源
最近更新 更多