首页 > 解决方案 > Django中的日期字段问题

问题描述

我正在努力解决 Django 中的一些 DateTime 问题。我相信这一切都归结为数据类型和转换,我只是不太明白。如果有人可以清理我的代码,我将不胜感激,如下所示。我也会要求不要改变太多。我对编程很陌生。我确信有更好的方法来完成我想做的事情,但我的理解仅限于以某种方式做事。因此,如果您能在不进行大规模更改的情况下帮助我完成这项工作,我将不胜感激。

好的...

作为一个学习项目,我正在 Django(Python 2、Django 1)中构建一个非常基本的“旅行应用程序”。我希望用户能够输入旅行的开始日期和结束日期。开始日期必须在将来,结束日期必须在开始日期之后。

首先,我在模型中创建我的 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()

我认为这一切都很好。

同样在模型中,我为“添加行程”表单设置了验证和添加方法。这是我现在所拥有的 - 我知道这里有一些错误:

class TripManager(models.Manager):

    def trip_validation(self, postData):

        start_date = datetime.strptime(postData['start_date'], "%Y-%m-%d")
        end_date = datetime.strptime(postData['end_date'], "%Y-%m-%d")

        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 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

    def trip_add(self, postData, user_id):
        destination = postData['destination']
        description = postData['description']
        start_date = datetime.strptime(postData['start_date'], "%Y-%m-%d")
        end_date = datetime.strptime(postData['end_date'], "%Y-%m-%d")
        user_obj = User.objects.get(id=user_id)

        return self.create(destination=postData['destination'], description=postData['description'], start_date=postData['start_date'], end_date=postData['end_date'], planned_by=user_obj) 

现在,当我运行应用程序时,我根本无法验证用户是否输入了日期 - 我得到了time data '' does not match format '%Y-%m-%d'. 所以这是第一个障碍,但我怀疑一旦我掌握了这一点,其余代码将更容易符合要求。

我没有在视图中包含我所做的事情,即调用 trip_validation 和 trip_add 方法,将错误放入上下文字典等,因为我认为这没问题(或者至少 Django 还没有抱怨,因为它可以'不要到那里!)。

谢谢你。

更新

我被要求发布视图和完整的回溯,所以来了......

视图中的 add_trip 方法:

def add_trip(request):
    if request.method == "POST":
        errors = Trip.objects.trip_validation(request.POST)

        if not errors:
            trip = Trip.objects.trip_add(request.POST, request.session['uid'])
            # redirect to individual trip page
            return render(request, 'html_files/add.html')

        else:
            context = {
                'errors' : errors
            }
            return render(request, 'html_files/add.html', context=context)

    elif request.method == "GET":
        first_name = User.objects.get(id=request.session['uid']).first_name

        context = {
            'first_name' : first_name,
        }
    return render(request, 'html_files/add.html', context=context)

目前,我只是尝试提交带有空“开始日期”字段的表单,希望通过上下文字典看到错误,即“请输入您的旅行的开始日期”。我还没有深入到代码中去工作。

追溯:

File "/Library/Python/2.7/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/gbroesche/Desktop/TravelBuddy/apps/trips/views.py" in add_trip
  22.       errors = Trip.objects.trip_validation(request.POST)

File "/Users/gbroesche/Desktop/TravelBuddy/apps/trips/models.py" in trip_validation
  15.       start_date = datetime.strptime(postData['start_date'], "%Y-%m-%d")

File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py" in _strptime
  325.                          (data_string, format))

Exception Type: ValueError at /trips/add/
Exception Value: time data '' does not match format '%Y-%m-%d'

标签: pythondjangodatetime

解决方案


推荐阅读