2

我试图让这个功能限制用户每张图片只能投一票。但是,它目前允许所有投票通过。如果我将“if existing_vote != 0:”更改为“if existing_vote == 0:”,它不会让任何投票通过。想法?

类投票处理程序(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()

密码 = db.StringProperty()

名称 = db.StringProperty()

创建 = db.DateTimeProperty(auto_now=True)

类图像(db.Model):

用户 = db.ReferenceProperty(用户)

photo_key = db.BlobProperty()

网站 = db.StringProperty()

文本 = db.StringProperty()

创建 = db.DateTimeProperty(auto_now=True)

票= db.IntegerProperty(默认= 1)

类投票(db.Model):

user = db.ReferenceProperty(User) #查看是否在本站投票

photo = db.ReferenceProperty(Image) #对正确的 URL 应用投票

upvote = db.IntegerProperty(default=1)

创建 = db.DateTimeProperty(auto_now=True)

4

2 回答 2

1

看起来您对用户的过滤器正在消除所有现有投票,即永远不会满足平等。事实上,我不确定我如何满足对引用的平等检查。为什么不改变

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

到,例如,

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

然后比较就变成了字符串之间的简单相等性检查,并且确保工作没有任何复杂性——在可行的情况下,简单性通常是可取的。

于 2010-09-02T00:27:29.233 回答
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()
于 2010-09-02T08:56:46.573 回答