VoteHandler в Google App Engine - PullRequest
       0

VoteHandler в Google App Engine

2 голосов
/ 02 сентября 2010

Я пытаюсь, чтобы эта функция ограничивала пользователя одним голосом за изображение.Однако в настоящее время он пропускает все голоса.Если я изменю «ifisting_vote! = 0:» на «ifisting_vote == 0:», он не пропустит ни одного голоса.Мысли?

класс VoteHandler (webapp.RequestHandler):

def get(self):
    #See if logged in
    self.Session = Session()
    if not 'userkey' in self.Session:
        doRender(
            self,
            'base/index.html',
            {'error' : 'Please login to vote'})
        return

    #If user hasn't voted - if user doesn't have a vote on that image object
    key = self.request.get('photo_id')
    vurl = models.Image.get_by_id(int(key))

    #pull current site vote total & add 1

    existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl).count()

    if existing_vote != 0:
        self.redirect('/', { })
    else:    
        newvote = models.Vote(user=self.Session['userkey'], url=vurl)
        vurl.votes += 1
        vurl.put()
        logging.info('Adding a vote')

        #Create a new Vote object
        newvote = models.Vote(user=self.Session['userkey'], url=vurl)
        newvote.put()    
        self.redirect('/', { })

Для моделей:

класс User (db.Model):

account = db.StringProperty ()

пароль = db.StringProperty ()

name = db.StringProperty ()

создал = db.DateTimeProperty (auto_now =True)

Изображение класса (db.Model):

user = db.ReferenceProperty (Пользователь)

photo_key = db.BlobProperty ()

website = db.StringProperty ()

text = db.StringProperty ()

создал = db.DateTimeProperty (auto_now = True)

голос = = дБ.IntegerProperty (по умолчанию = 1)

класс Голосование (db.Model):

user = db.ReferenceProperty (Пользователь) # См., Если на этом сайте еще проголосовали

photo = db.ReferenceProperty (Image) # Чтобы применить голосование к нужному URL-адресу

upvote = db.IntegerProperty (по умолчанию = 1)

создал = db.DateTimeProperty (auto_now =Правда)

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

В этой строке здесь:

existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl).count()

Вам необходимо поместить пробел между 'photo' и '=' в фильтрах - в противном случае он пытается отфильтровать свойство под названием 'photo =».Это должно работать:

existing_vote = models.Vote.all().filter('user =', self.Session['userkey']).filter('photo =',vurl).count()
1 голос
/ 02 сентября 2010

Похоже, ваш фильтр пользователя уничтожает все существующие голоса, т. Е. Равенство там никогда не выполняется. И действительно, я не уверен, как бы я соответствовал проверке равенства на ссылке надлежащим образом. Почему бы не изменить

user = db.ReferenceProperty(User) #See if voted on this site yet

до, например,

useraccount = db.StringProperty()  # account of user who cast this vote

Тогда сравнение становится простой проверкой равенства между строками и, несомненно, будет работать без каких-либо сложностей - простота обычно предпочтительнее, когда это возможно.

...