首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Date ValidationError in Django

Date ValidationError in Django
EN

Stack Overflow用户
提问于 2013-06-07 22:53:43
回答 2查看 2.8K关注 0票数 1

我想阻止30天后付费计划过期的用户(尽管我可能会在以后更改天数)。并将他们重定向到付款页面。我通过检查数据库是否达到了过期日期来做到这一点,这样就可以阻止他们查看独家内容。我写了下面的代码来执行这个操作,但是我得到了这个错误:

代码语言:javascript
复制
ValidationError at /owo/
[u"'expire' value has an invalid date format. It must be in YYYY-MM-DD format."]

我还想知道这种方法是否是执行操作的最佳方法,或者我应该移动代码并将其放入middleware.py中。

模型

代码语言:javascript
复制
class Paid(models.Model):
   user=models.ForeignKey(User)
   pub_date=models.DateTimeField()
   expire = models.DateField(_('expire'), default=None, blank=True, null=True, db_index=True)
   active=models.BooleanField(_('active'), default=False, db_index=False)
   sid=models.CharField(max_length=100,default='1303908')
   mode=models.CharField(max_length=10, default='2CO')
   li_0_type=models.CharField(max_length=100, default='Product')
   li_0_name=models.CharField(max_length=100, default='Monthly Subscription')
   li_0_price=models.CharField(max_length=100, default='500')


   def __unicode__(self):
       return self.user

   def is_active(self):
       return self.active

   def is_expired(self):
       if self.expire is None:
          return False
       else:
          return self.expire < date.today()

保存付费用户的视图:

代码语言:javascript
复制
def two_check(request):
    if request.method=="POST":
      form=PaidForm(request.POST)
      if form.is_valid():
         data=form.cleaned_data
         newtwo=Paid(
            user=request.user,
            pub_date=datetime.datetime.now(),
            expire=datetime.datetime.now()+ datetime.timedelta(days=29),
            active=data['active'],
            sid=data['sid'],
            mode=data['mode'],
            li_0_type=data['li_0_type'],
            li_0_name=data['li_0_name'],
            li_0_price=data['li_0_price'])
         newtwo.save()
         return HttpResponseRedirect('/confirm_two/')
      else:
         return HttpResponse('Oops error')
   else:
     return render_to_response('two.html'{'PaidForm':PaidForm},context_instance=RequestContext(request))

查看过期用户

代码语言:javascript
复制
def check_use(request):
   d=datetime.date.today()
   if request.user.is_authenticated():
       if Paid.objects.get(expire='expire') >= d.strptime("%Y-%m-%d"):
          return HttpResponseRedirect('/pay_plan/')
       else:
          return HttpResponseRedirect('/owo/')
   return render_to_response('eyowo.html',{'Paid':Paid},context_instance=RequestContext(request))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-08 02:11:44

首先,我可以在您的代码中看到两个问题

  1. 我不明白这是什么意思:

代码语言:javascript
复制
Paid.objects.get(expire='expire')

您正在尝试在用户的基础上获取付费对象,并查找付费对象是否过期,因此如下所示更合适

代码语言:javascript
复制
Paid.objects.get(user=request.user).expire >= d.strptime("%Y-%m-%d"):

另一个问题和karthikr提到的一样。

expire是一个日期字段,而不是datetime,因此您会得到一个ValidationError。这里提到的数据类型是要发送的数据类型为datetime的日期

由于错误提到它需要'YYYY-MM-DD‘格式的日期时间

试试这样的东西

代码语言:javascript
复制
>>> datetime.datetime.now().date() + datetime.timedelta(days=29)
datetime.date(2013, 7, 6)
>>> str(datetime.datetime.now().date() + datetime.timedelta(days=29))
'2013-07-06'

尝试以YYYY-MM_DD格式发送此字符串

票数 1
EN

Stack Overflow用户

发布于 2013-06-07 22:57:09

这条线

代码语言:javascript
复制
 expire=datetime.datetime.now()+ datetime.timedelta(days=29)

提供了日期和时间值,您只需要日期-所以使用.date()

即:

代码语言:javascript
复制
 expire = datetime.datetime.now().date() + datetime.timedelta(days=29)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16987068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档