MultipleChoiceField问题:无法在views.py侧绑定数据

forms.py class DeepSearchForm(forms.Form): select_ip = forms.CharField(required=False, widget=forms.HiddenInput(attrs={'id':'select_ip',})) server_ip_name = forms.MultipleChoiceField(label=u'服务器', required=False, widget=forms.CheckboxSelectMultiple, choices=()) select_type = forms.CharField(required=False, widget=forms.HiddenInput(attrs={'id':'select_type',})) log_type = forms.MultipleChoiceField(label=u'日志类型', required=False, widget=forms.CheckboxSelectMultiple, choices=()) select_level = forms.CharField(required=False, widget=forms.HiddenInput(attrs={'id':'select_level',})) log_level = forms.CharField(label=u'日志级别', max_length=50, required=False, widget=forms.TextInput(attrs={'size':30,})) select_start = forms.CharField(required=False, widget=forms.HiddenInput(attrs={'id':'select_start',})) start_date = forms.SplitDateTimeField(label=u'开始时间', required=False, widget=forms.SplitDateTimeWidget( date_format='%Y-%m-%d', time_format='%H:%M:%S', ), initial= datetime.datetime.now()) select_end = forms.CharField(required=False, widget=forms.HiddenInput(attrs={'id':'select_end',})) end_date = forms.SplitDateTimeField(label=u'结束时间', required=False, widget=forms.SplitDateTimeWidget( date_format='%Y-%m-%d', time_format='%H:%M:%S', ), initial= datetime.datetime.now()) def init(self, *args, kwargs): super(DeepSearchForm, self).init(*args, kwargs) server_list = tbl_service_attribute.objects.all() ip_name_list = [] for row in server_list: str_ip = socket.inet_ntoa(struct.pack('I', socket.htonl(row.server_ip))) tup_line = (row.server_ip, u'%s %s'%(str_ip, row.server_name)) new_tup = (tup_line) ip_name_list.append(new_tup) self.fields['server_ip_name'].widget.choices = ip_name_list log_type_list = [] collect_list = tbl_collect_attribute.objects.values('log_type').distinct() for row in collect_list: tup_line = (row['log_type'], row['log_type']) new_tup = (tup_line) log_type_list.append(new_tup) self.fields['log_type'].widget.choices = log_type_list

    self.initial['select_ip'] = '1'
    self.initial['select_type'] = '1'
    self.initial['select_level'] = '1'
    self.initial['select_start'] = '1'
    self.initial['select_end'] = '1'

    views.py

def deepsearch(request):
if request.method == 'POST':    
    deepsearchForm = DeepSearchForm(request.POST)

    if deepsearchForm.is_valid():

问题: forms定义控件,在HTML显示正常。 多选框的值,如果不选择,则 is_valid 返回的是True 有任一个选择后,views.py里绑定值出现问题。is_valid 返回的是False

把 request.POST打印出来,发现:根本没有checkbox选项和值在里面。 如下: <QueryDict: {u'search': [u'\u641c\u7d22'], u'select_level': [u'1'], u'log_level': [u''], u'end_date_0': [u'2019-09-09'], u'select_start': [u'1'], u'end_date_1': [u'19:39:29'], u'select_end': [u'1'], u'start_date_0': [u'2019-09-09'], u'start_date_1': [u'19:39:29'], u'select_type': [u'1'], u'csrfmiddlewaretoken': [u'dJO0EeSvsdqwxaJEvqWhv9OWJwkFa6t6'], u'select_ip': [u'1']}>

后来采用:request.POST.getlist('server_ip_name') 这样去获取,是可以取到的。 由于forms里的取值,我需要多次访问与响应间带回原来的值。所以需要直接把request.POST的值绑定给forms,请问哪里处理得有问题。

谢谢!

评论 0