我对 Django 和一般编程还很陌生,我面临着以前从未见过的挑战。我正在寻找有关 DateTimeField() 的一些帮助。
作为一个学习项目,我正在设置一个简单的旅行应用程序。我希望用户能够添加旅行、描述等。到目前为止,还不错。
我想将两个 DateTimeFields 添加到我的行程模型中。输入的开始日期必须是 future 的日期(从他们使用应用程序的时间开始),而结束日期必须在开始日期(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),我错过了。这是我在模型中的行程表:
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
在 View 中,我调用 trip_validation 方法并通过上下文字典将错误发送到模板。
所有验证方法都有效保存 elif not postData['start_date'] > timezone.now(): 和 elif not self.end_date > self.start_date: .
我收到以下错误:TypeError at/trips/add/ 无法将 datetime.datetime 与 unicode 进行比较。
这让我相信我没有正确使用内置的 DateField 函数。
谢谢。
请您参考如下方法:
我更喜欢将这些字段设置为 blank=True 和 null=True 并进行一些验证检查通过覆盖 Trip 模型的 save() 方法,作为
from django.utils import timezone
from django.core.exceptions import ValidationError
class Trip(models.Model):
# your fields
start_date = models.DateTimeField(<b>blank=True, null=True</b>)
end_date = models.DateTimeField(<b>blank=True, null=True</b>)
# your fields
<b>def save(self, *args, **kwargs):
if self.start_date:
if not self.start_date > timezone.now():
raise ValidationError("start_time must be greater than current time")
if self.end_date:
if not self.start_date:
raise ValidationError("start time missing. Please check the data")
if not self.end_date > self.start_date:
raise ValidationError("end time must be greater than start time")
super().save(*args, **kwargs)</b>
