我想阻止30天后保费计划已过期的用户(尽管我可能会在以后更改日期)。并将其重定向到付款页面。我这样做是通过检查数据库是否达到了有效期限,这样就可以阻止他们查看独家内容。我编写了以下代码来执行操作但我收到此错误:
ValidationError at /owo/
[u"'expire' value has an invalid date format. It must be in YYYY-MM-DD format."]
我还想知道这种方法是否是执行操作的最佳方法,或者我应该移动代码并将其放在middleware.py中。
模型
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()
保存付费用户的观点:
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))
查看过期用户的视图
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))
答案 0 :(得分:1)
该行
expire=datetime.datetime.now()+ datetime.timedelta(days=29)
提供日期和时间值,您只需要日期 - 所以请使用.date()
即;
expire = datetime.datetime.now().date() + datetime.timedelta(days=29)
答案 1 :(得分:1)
在第一个实例中,我可以在代码中看到两个问题
1。 我不明白这个意思:
Paid.objects.get(expire='expire')
您正在尝试根据用户获取Paid对象,并查找Paid对象是否已过期,因此这样的事情更合适
Paid.objects.get(user=request.user).expire >= d.strptime("%Y-%m-%d"):
另一个问题与karthikr提到的相同
expire是一个datefield而不是datetime,因此你得到一个ValidationError,提到的数据类型是一个发送数据类型是datetime的日期
由于错误提及它预期日期时间为&#39; YYYY-MM-DD&#39;
尝试这样的事情
>>> 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中发送此字符串