Crispy表单django错误:强制转换为Unicode:需要字符串或缓冲区,找到datetime.date

时间:2017-09-19 22:26:09

标签: python django django-crispy-forms

所以我在填充数据库后会出现此错误,但是在创建新数据时。如果我没有运行我编写的csv导入程序(只需从旧数据库中获取CSV文件,导入模型。创建模型的新实例,用数据填充并保存它们)然后添加新组(我的应用程序中的实体工作得很好。如果我运行导入器然后编辑中断并添加此错误,表单将显示为空并准备就绪:

enter image description here

我不确定是什么原因造成的。进口商很简单。可能是因为我错误地写了csv函数的parse_date?

 Usage

provider.date_of_birth = parseDateTime(row[4])#parseDateTime(row[4]).strftime('%Y-%m-%d')


def parseDateTime(dt):
  try:
    col_date_object = datetime.strptime(dt, '%m/%d/%Y')
  except ValueError:
    col_date_object = datetime.now()
  return col_date_object

我仔细检查了导入并浏览了数据库表,以确保我没有关闭行或列或其他东西。确实事情看起来不错

有问题的模型是:

@python_2_unicode_compatible
class Group(models.Model):
  group_term = models.ForeignKey('GroupTerm', on_delete=models.SET_NULL, null=True, blank=True) #quesiton is can a group be termed many times?

  group_name = models.CharField(max_length=50)
  group_contact = models.CharField(max_length=50)
  tin = models.CharField(max_length=50)
  npi = models.CharField(max_length=50)
  notes = models.TextField(max_length=255, null=True, blank=True)
  start_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
  end_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
  change_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
  change_text = models.TextField(max_length=255, null=True, blank=True)
  term_comment = models.TextField(max_length=255, null=True, blank=True)
  group_phone = models.CharField(max_length=50)
  group_fax = models.CharField(max_length=50)

  billing_address_line_one = models.CharField(max_length=50)
  billing_address_line_two = models.CharField(max_length=50, null=True, blank=True)
  billing_city = models.CharField(max_length=50)
  billing_state = models.CharField(max_length=50)
  billing_zip_code = models.CharField(max_length=50)

  mailing_address_line_one = models.CharField(max_length=50)
  mailing_address_line_two = models.CharField(max_length=50, null=True, blank=True)
  mailing_city = models.CharField(max_length=50)
  mailing_state = models.CharField(max_length=50)
  mailing_zip_code = models.CharField(max_length=50)

  default_location = models.BooleanField(default=True)

  created_at = models.DateField(auto_now_add=True)
  updated_at = models.DateField(auto_now=True)

  class Meta:
    ordering = ['-created_at']

  def __str__(self):
    return self.group_name

1 个答案:

答案 0 :(得分:0)

我认为你必须首先处理字符串,然后你需要以日期格式存储它。这就是我尝试在这里做的原因。来自csv文件的Coz结果是一个字符串。

假设有一个类似下面的CSV文件。

year,month,day,hour,minute
2017,12,31,23,59

您可以解析csv并创建日期时间对象。

import csv
from datetime import date

with open('filename.csv') as fp:
   reader = csv.reader(fp)
   next(reader) # skip header
   for row in reader:
       row = [int(r) for r in row]
       print(date(row[1], row[2], row[0]))

结果将是这样的。

12-31-2016