Django 访问form.u数据中缺少的值

Django 访问form.u数据中缺少的值,django,django-forms,Django,Django Forms,我试图动态生成字段,如中所示。我的案例略有不同,我希望使用动态创建的multiplechoicefield。这就是我想到的 views.py def browseget(request): success = False if request.method == 'POST': list_form = ListForm(request.POST) if list_form.is_valid(): success = True

我试图动态生成字段,如中所示。我的案例略有不同,我希望使用动态创建的multiplechoicefield。这就是我想到的

views.py

def browseget(request):
    success = False
    if request.method == 'POST':
        list_form = ListForm(request.POST)
        if list_form.is_valid():
            success = True
            path = list_form.cleaned_data['path']
            minimum_size = list_form.cleaned_data['minimum_size']
            follow_link = list_form.cleaned_data['follow_link']
            checkboxes = list_form.cleaned_data['checkboxes']
            ....do something
    else:
        list_form = ListForm(name_list)
    ctx = {'success': success, 'list_form': list_form, 'path': path, 'minimum_size': minimum_size}
    return render_to_response('photoget/browseget.html', ctx, context_instance=RequestContext(request))
forms.py

class ListForm(forms.Form):
    path = forms.CharField(required=False)
    minimum_size = forms.ChoiceField(choices=size_choices)
    follow_link = forms.BooleanField(required=False, initial=True)

    def __init__(self, *args, **kwargs):
        name_list = kwargs.pop('name_list', None)
        super(ListForm, self).__init__(*args, **kwargs)
        print 'Received data:', self.data
        if name_list:
            name_choices = [(u, u) for u in name_list]
            self.fields['checkboxes'] = forms.MultipleChoiceField(required=False, label='Select Name(s):', widget=forms.CheckboxSelectMultiple(), choices=name_choices)

    def clean_path(self):
        cd = self.cleaned_data
        path = cd.get('path')
        if path == '': path = None
        return path

    def clean_minimum_size(self):
        cd = self.cleaned_data
        minimum_size = cd.get('minimum_size')
        if minimum_size is None: minimum_size = 0
        return int(minimum_size)

表单生成并完美显示。。。直到我发布一些数据。“复选框”字段不显示在list_form.cleaned_data.items()中,而显示在self.data中。实际上,表单会因KeyError异常而中断。因此,我在问,如何访问复选框数据?

当您在POST上重新实例化表单时,您没有传递
name\u list
参数,因此不会创建该字段,因为
if name\u list
为False。

您的代码中有一段时间介于
清理的数据
[checkbox]
。这将导致语法错误,这将阻止post条件代码成功运行。您能准确地显示您现在得到了什么吗?问题是,您发布的当前代码一开始甚至不会创建复选框字段,因为您没有将
name\u list
作为kwarg传递。谢谢@Daniel。问题在于传递name_list变量,因为它是在函数范围外定义的。通过使name_list成为dict中的一个值,克服了范围限制。