1

プレミアム プランの有効期限が 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))
4

2 に答える 2

1

最初のインスタンスで、コードに 2 つの問題があることがわかります

1. 次の意味がわかりません。

Paid.objects.get(expire='expire')

ユーザーに基づいて有料オブジェクトを取得しようとしており、有料オブジェクトの有効期限が切れているかどうかを確認しようとしているため、このようなものがより適切です

Paid.objects.get(user=request.user).expire >= d.strptime("%Y-%m-%d"):

他の問題は、karthikrが言及したのと同じです

expire は datetime ではなく datefield であるため、 ValidationError が返されます 言及されているデータ型は、送信されるデータ型が datetime である日付です

エラーが言及しているため、「YYYY-MM-DD」の日時が必要です

このようなことを試してください

>>> 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 で送信してみてください

于 2013-06-07T18:11:44.453 に答える