我对Django和编程领域非常陌生,并且面临着前所未有的挑战。我需要有关DateTimeField()的帮助。
作为一个学习项目,我正在设置一个简单的旅行应用程序。我希望用户能够添加旅行,说明等。到目前为止,一切都很好。
我想在旅行模型中添加两个DateTimeFields。输入的起始日期必须是将来的日期(从他们使用该应用程序的时间起),而终止日期必须在起始日期(natch)之后。如何将此编程到我的模型中?
这是我的Trip类的当前代码:
class Trip(models.Model):
destination = models.CharField(max_length=55)
description = models.TextField()
start_date = models.DateTimeField(??)
end_date = models.DateTimeField(??)
travellers = models.ManyToManyField(User, related_name="trips")
planned_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="trips_added")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
谢谢。
更新
谢谢你们,我越来越近了。但是,我认为我缺少的DateField中有一两道皱纹(我实际上不需要DateTimeField)。这是模型中的Trip表:
class Trip(models.Model):
destination = models.CharField(max_length=55)
description = models.TextField()
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
travelers = models.ManyToManyField(User, related_name="trips")
planned_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="trips_added")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = TripManager()
在模型中,在TripManager下,我还具有以下验证方法:
def trip_validation(self, postData):
errors = {}
if len(postData['destination']) < 1:
errors['destination'] = 'You must enter trip destination.'
if len(postData['description']) < 1:
errors['description'] = 'You must enter trip description.'
if len(postData['start_date']) < 1:
errors['start_date'] = 'Please enter a start date for your trip.'
elif not postData['start_date'] > timezone.now():
errors['start_date'] = 'Your trip start date must be in the future.'
if len(postData['end_date']) < 1:
errors['end_date'] = 'Please enter an end date for your trip.'
elif not self.end_date > self.start_date:
errors['end_date'] = 'Trip end date must be after start date.'
return errors
在视图中,我调用trip_validation方法,并通过上下文字典将错误发送到模板。
除elif not postData['start_date'] > timezone.now():
和elif not self.end_date > self.start_date:
之外,所有验证方法均有效。
我收到以下错误:TypeError at /trips/add/
can't compare datetime.datetime to unicode
。
这使我相信我没有正确地使用内置的DateField函数。
谢谢。
答案 0 :(得分:1)
我更愿意将这些字段设置为blank=True
和null=True
,并通过覆盖 save()
进行一些 验证检查 } 模型的方法,如
Trip
答案 1 :(得分:0)
您不在模型中这样做。该模型只是数据库中的一个表,因此您只需定义start_date和end_date字段的类型为DateTimeField。您可以在这里找到更多信息:Django Models
您想要完成的工作可以在Django的其他部分中完成,例如在视图中。在那里,当您获得用户插入的日期时,可以验证start_date在将来,而end_date在以后。
答案 2 :(得分:0)
比较之前,您需要转换为正确的数据类型。 您可以如下所示使用datetime.strptime()。
from datetime import datetime
s_date = datetime.strptime(postData['start_date'], "%Y-%m-%d")
e_date = datetime.strptime(postData['end_date'], "%Y-%m-%d")