django使用ModelMultipleChoiceField和CheckboxSelectMultiple()小部件以形式呈现初始值

时间:2014-03-16 15:14:54

标签: python django django-forms

我有以下表格:

class TutorForm(SignupForm):
   subjects = forms.ModelMultipleChoiceField(queryset=Subject.objects.all(),
                                          widget=forms.CheckboxSelectMultiple())

我有一个名为TutorUpdateForm的子表单,它继承自TutorForm,并在init方法中设置初始值。

self.fields['subjects'].initial = current_user.subjects.all()

在我的模板中,不会检查值(在视图中值存在,因此设置初始值有效)。如何在模板中强制执行检查输入?

编辑(初始代码)

def __init__(self, *args, **kwargs):
    current_user = None
    try:
        current_user = kwargs.pop('user')
    except Exception:
        pass
    super(TutorUpdateForm, self).__init__(*args, **kwargs)

    for field in _update_exclude:
        self.fields.pop(field)

    if current_user:
        self.fields['subjects'].initial = current_user.subjects.all()

1 个答案:

答案 0 :(得分:5)

您应该将初始值传递给super的调用,您还可以为dict.pop设置默认值,而不是使用try / except

def __init__(self, *args, **kwargs):
    current_user = kwargs.pop('user', None)

    initial = kwargs.get('initial', {})
    if current_user:
        initial.update({'subjects': current_user.subjects.all()})
    kwargs['initial'] = initial

    super(TutorUpdateForm, self).__init__(*args, **kwargs)

    for field in _update_exclude:
        self.fields.pop(field)

以下是dynamic initial values for forms

上文档的链接