【问题标题】:Set initial value of checkbox dynamically动态设置复选框的初始值
【发布时间】:2013-04-09 23:43:51
【问题描述】:

我有一个带有 CheckboxSelectMutliple 小部件的 MultipleChoiceField:

weight_training_days = forms.MultipleChoiceField(
    help_text=u'(Required) 3 days must be selected',
    widget=forms.CheckboxSelectMultiple(attrs={
        'inline': True,
    }),
    choices=(
        (0, "Mon"),
        (1, "Tue"),
        (2, "Wed"),
        (3, "Thu"),
        (4, "Fri"),
        (5, "Sat"),
        (6, "Sun"),
    ),
)

我正在尝试将 7 个复选框中的 3 个动态设置为“True”。理想情况下,我会从视图中执行此操作。

def change_challenge_settings_page(request):

    c = Challenge.objects.get(user__exact = request.user,chal_status=1)

    layout = 'horizontal'
    form =UpdateChallengeSettingsForm(initial={'goal': c.level_goal }) 

    return render(request, 'portal/portal_change_challenge_settings.html', {'form': form,'layout': layout,'scorecard_page': True,})

我知道如何使用 ChoiceFields 来做到这一点(在上面的示例中,“目标”是一个 ChoiceField),但在涉及 MultipleChoiceFields 时却被卡住了。我非常感谢任何想法/反馈。

【问题讨论】:

    标签: django forms


    【解决方案1】:

    您可以将首字母设置为列表。在这种情况下,如果您设置YourForm(inital={'weight_training_days': [0,1,2]}),它将默认选择星期一、星期二和星期三。你也可以这样做forms.MultipleChoiceField(... inital=[0,1,2] ...)

    【讨论】:

    • 完美!工作得很好。我非常感谢您的反馈。
    • 没问题,很高兴能帮上忙。
    • 为了完整起见并节省下一个想知道几分钟的人:[0,1,2] 对应于选择元组中的第一个元素(如(0, "Mon"),...)并且不是其中的索引复选框列表中的复选框应该被选中。如果您的选择是[("foo", "value")...],则需要通过["foo"] 来预选第一个框。
    【解决方案2】:

    这很简单,只需传递一个列表。这是一个完整的例子:

    from django import forms
    class UpdateChallengeSettingsForm(forms.Form):
        weight_training_days = forms.MultipleChoiceField(
            help_text=u'(Required) 3 days must be selected',
            widget=forms.CheckboxSelectMultiple(attrs={
                'inline': True,
            }),
            choices=(
                (0, "Mon"),
                (1, "Tue"),
                (2, "Wed"),
                (3, "Thu"),
                (4, "Fri"),
                (5, "Sat"),
                (6, "Sun"),
            ),
        )
    
    form = UpdateChallengeSettingsForm(initial={
        'weight_training_days': [1,2,4,5,6],
    })
    
    print form.as_p()
    

    还有输出:

    <p><label for="id_weight_training_days_0">Weight training days:</label> <ul>
    <li><label for="id_weight_training_days_0"><input inline="True" type="checkbox" name="weight_training_days" value="0" id="id_weight_training_days_0" /> Mon</label></li>
    <li><label for="id_weight_training_days_1"><input checked="checked" name="weight_training_days" value="1" inline="True" type="checkbox" id="id_weight_training_days_1" /> Tue</label></li>
    <li><label for="id_weight_training_days_2"><input checked="checked" name="weight_training_days" value="2" inline="True" type="checkbox" id="id_weight_training_days_2" /> Wed</label></li>
    <li><label for="id_weight_training_days_3"><input inline="True" type="checkbox" name="weight_training_days" value="3" id="id_weight_training_days_3" /> Thu</label></li>
    <li><label for="id_weight_training_days_4"><input checked="checked" name="weight_training_days" value="4" inline="True" type="checkbox" id="id_weight_training_days_4" /> Fri</label></li>
    <li><label for="id_weight_training_days_5"><input checked="checked" name="weight_training_days" value="5" inline="True" type="checkbox" id="id_weight_training_days_5" /> Sat</label></li>
    <li><label for="id_weight_training_days_6"><input checked="checked" name="weight_training_days" value="6" inline="True" type="checkbox" id="id_weight_training_days_6" /> Sun</label></li>
    </ul> <span class="helptext">(Required) 3 days must be selected</span></p>
    

    【讨论】:

      【解决方案3】:

      OP 说他们理想地希望在视图中执行此操作,我发现通常情况下您希望在视图级别而不是表单级别动态指定这些。

      这就是您在视图级别执行此操作的方式

          form = MySelectForm()
          form.fields['my_choice_field'].initial = [1,2,3] 
      

      您还可以通过以下方式动态指定选项(不仅仅是最初选择的选项):

          form.fields['my_choice_field'].choices = [1,2,3,4,5,6,7] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 2018-05-04
        • 1970-01-01
        • 2014-08-28
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        相关资源
        最近更新 更多