2013-06-07 4 views
1

Я хочу заблокировать пользователей, чей премиальный план истек через 30 дней (хотя я мог бы изменить дни позже). И перенаправить их на страницу оплаты. Я делаю это, проверяя db, если срок действия достигнут, поэтому он может заблокировать их от просмотра эксклюзивного контента. Я написал следующие коды для выполнения операции, но я получаю эту ошибку:Дата ValidationError в Django

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

Просмотр для проверки EXPIRED пользователей

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

Где вы получаете сообщение об ошибке? –

+0

с точки зрения проверки пользователей. – picomon

+0

эта строка проблематична: если Paid.objects.get (expire = 'expire')> = d.strptime ("% Y-% m-% d"). вы не можете передать строку («expire»), должна быть дата –

ответ

1

Ну по первой инстанции я вижу две проблемы в коде

1. Я не понимаю смысл этого:

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

Вы пытаетесь получить Платный объект на основе пользователя и найти, если срок действия Платного объекта истек, поэтому более подходит

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

Другая проблема такая же, как karthikr отметил

истекают является 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' 

Try послать эту строку в формате YYYY-MM_DD

+0

Спасибо. Это сработало! – picomon

1

Линия

expire=datetime.datetime.now()+ datetime.timedelta(days=29) 

- Дать указание даты и времени; так используйте .date()

ie;

expire = datetime.datetime.now().date() + datetime.timedelta(days=29) 
+0

все еще то же самое после его изменения. – picomon

Смежные вопросы