0

我有一个由查询集生成的表单中的 ModelMultipleChoiceField。

class NewEvaluationPriorityForm(forms.Form):

priority_field = forms.ModelMultipleChoiceField(
    queryset=None,
    widget=forms.CheckboxSelectMultiple,
    required=False
)

def __init__(self, user_type, qi_list, hgiours_list, is_hgiours_evaluation, school, *args, **kwargs):
    super(NewEvaluationPriorityForm, self).__init__(*args, **kwargs)

    if is_hgiours_evaluation is True:
        priorities = Priority.objects.get_new_hgiours_evaluation_priorities(
            hgiours_list,
            school
        )
    else:
        priorities = Priority.objects.get_new_evaluation_priorities(
            qi_list,
            user_type,
            school
        )

    self.fields['priority_field'].queryset = priorities
    self.fields['priority_field'].label = ''

我想要做的是使用列表设置字段中不同复选框的初始值。我尝试了以下方法(我知道查询集中有 5 个对象):

self.fields['priority_field'].initial = [True, False, True, False, True]

但这不起作用。

我需要做什么?

4

1 回答 1

1

所以我一直在寻找的解决方案是您需要提供一个要设置为 True 的查询集键列表。

所以例如

self.fields['priority_field'].initial = ['1024', '1025']

其中 1024 和 1025 是应检查为 True 的查询集对象的 pks

对于上下文,如果用户选择了不同的页面,我试图将表单中的所有选中项临时保存在 request.session 键中,然后在用户返回表单时恢复选中项。

解决方案:

  1. 当用户使用 request.POST.getlist() 离开页面时,将键列表存储在会话变量中:

    request.session['selected_priorities_keys'] = request.POST.getlist('priority_field')
    
  2. 重新加载页面时测试会话密钥是否存在

    if 'selected_priorities_keys' in request.session:
        checked_key_list = request.session['selected_priorities_keys']
    else:
        checked_key_list = []
    
  3. 将此列表传递给表单init并使用它来初始化 ModelMultipleChoiceField 字段。

    self.initial['priority_field'] = checked_key_list
    
于 2018-07-03T11:02:39.260 回答