2010-09-01 4 views
2

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

класс 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('/', { }) 

Для моделей:

класс пользователя (db.Model):

счет = db.StringProperty()

password = db.StringProperty()

имя = db.StringProperty()

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

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

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

photo_key = db.BlobProperty()

сайт = db.StringProperty()

текст = db.StringProperty()

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

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

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

пользователя = db.ReferenceProperty (пользователь) #See, если голосование на этом сайте еще

фото = db.ReferenceProperty (Изображение) # по применить голосование по правому URL

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

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

+0

Что такое счет? Добавьте оператор регистрации и попытайтесь выяснить, что это действительно возвращает: existing_vote = models.Vote.all(). Filter ('user =', self.Session ['userkey']). Filter ('photo =' , vurl) .count() Лучшей реализацией будет создание класса голосования в качестве дочернего объекта Пользователя в группе лиц с ключом photoId. Отключить тему, но не могли бы вы спросить, почему вы внедрили свой собственный пользовательский класс вместо использования учетных записей Google или OpenID? –

+0

1. Журналы показывают existing_vote = 0 2. n00b здесь, и ушел из учебника в книге, которая создала класс пользователя ... – Emile

ответ

1

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

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

к, например,

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

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

+0

Не следует ли использовать счетчик? Я что-то упускаю? –

+0

@Matt, подсвеченный счетчик, который считается только 0 или 1, и вводится каждой пары пользователей и изображений ...? Мне кажется странным - позаботьтесь о том, чтобы ответить на вопрос, потому что я просто не могу понять, что комментарий и комментарии слишком ограничены, потому что вы, возможно, достаточно расширяете его. –

+0

@Matt @Alex - ответы на вопросы. Вот что я получил вчера вечером: http://gist.github.com/562252. И я не знаком с закрытым счетчиком, проверяя, что сейчас – Emile

1

На этой линии здесь:

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

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

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

, что определенно было частью этого. Удивительно, но да, пространство было частью проблемы. – Emile

+0

Это определенно получилось, но мы не можем изменить его, не нарушая существующие приложения. Это имеет смысл, когда вы понимаете, что «foo =» является допустимым именем свойства. Вы можете продолжать использовать свойства Reference, хотя - <, = and > - все действительные операции над ссылочным свойством. –