首页 > 解决方案 > 如何清理可选的 Django 表单字段

问题描述

我有一个带有可选字段的 Django 搜索表单。如果使用该字段,则应在clean_{field_name}. '>' not supported between instances of 'NoneType' and 'datetime.date'但是,当该字段为空时,我不断收到错误消息。当我做一个Request URL:http://localhost:8000/dockets/p_CentralGrocers/(所以根本没有传递查询参数)时,cleaned_data参数仍然有一个字段名称的空白项,这会导致日期时间与空白字段进行比较,从而导致错误。在清洁过程中处理可选字段的最佳方法是什么?

  1 from django import forms
  2 from django.core.exceptions import ValidationError 
  3 from django.utils.translation import ugettext_lazy as _
  4 import datetime
  5                                          
  6 class SearchDocketForm(forms.Form):      
  7                                          
  8     from_date = forms.DateField(help_text="Enter start date for search", required=False)
  9     to_date = forms.DateField(help_text="Enter to date for search", required=False) 
 10 
 11     def clean_from_date(self):           
 12         data = self.cleaned_data['from_date']
 13         if not data return ''                                                                      
 14 
 15         # check if date is in the past   
 16         if data > datetime.date.today(): 
 17             raise ValidationError(_('Invalid date - from date in the future'))
 18         return data

标签: pythondjango

解决方案


首先,我相信

'>' not supported between instances of 'NoneType' and 'datetime.date'

是解析的问题。

当您发布数据时,数据将只是字符串。例如:“01/01/2001”如果您发布任何值,它将是数据的值。

您必须在比较之前将其更改为 datetime 对象。

from datetime import datetime

.....
def clean_from_date(self):
    data = self.cleaned_data['from_date']
    if not data return ''                                                                      
    # Parse according to the format you're planning to post.
    data = datetime.strptime(data, "%D %M %Y")
    if data > datetime.date.today(): 
        raise ValidationError(_('Invalid date - from date in the future'))
    return data

其次,验证您是否有任何

from_date = models.DateField(default=datetime.now())

在models.py中设置。

提示:在 if 语句之前尝试 print(data),它将在控制台中为您提供数据内容。


推荐阅读