Gul*_*led 1 python flask peewee
我目前正在实施一个upvoting系统(在应用程序中不使用向下投票系统).我设法在我的应用程序中为Post模型创建了一个upvote属性.该属性的默认值为0,如下所示:
models.py
class User(UserMixin, Model):
username = CharField(unique= True)
email = CharField(unique= True)
password = CharField(max_length = 100)
joined_at = DateTimeField(default = datetime.datetime.now)
is_admin = BooleanField(default = False)
confirmed = BooleanField(default = False)
confirmed_on = DateTimeField(null=True)
class Meta:
database = DATABASE
order_by = ('-joined_at',)
def get_posts(self):
return Post.select().where(Post.user == self)
def get_stream(self):
return Post.select().where(
(Post.user == self)
)
@classmethod
def create_user(cls, username, email, password, is_admin= False, confirmed = False, confirmed_on = None):
try:
with DATABASE.transaction():
cls.create(
username = username,
email = email,
password = generate_password_hash(password),
is_admin = is_admin,
confirmed = confirmed,
confirmed_on = confirmed_on)
except IntegrityError:
raise ValueError("User already exists")
class Post(Model):
timestamp = DateTimeField(default=datetime.datetime.now)
user = ForeignKeyField(
rel_model = User,
related_name = 'posts'
)
name = TextField()
content = TextField()
upvotes = IntegerField(default=0)
url = TextField()
category = TextField()
class Meta:
database = DATABASE
order_by = ('-timestamp',)
Run Code Online (Sandbox Code Playgroud)
我设法通过让用户关注链接来增加值:
stream.html
<div class="voting_bar">
<a href="/vote/{{post.id}}"><img src="/static/img/upvote.png"></a>
<p>{{post.upvotes}}</p>
</div>
Run Code Online (Sandbox Code Playgroud)
这将激活具有相关路线的功能:
app.py
@app.route('/vote/<int:post_id>')
def upvote(post_id):
posts = models.Post.select().where(models.Post.id == post_id)
if posts.count() == 0:
abort(404)
post = models.Post.select().where(models.Post.id == post_id).get()
query = models.Post.update(upvotes = (post.upvotes+1)).where(models.Post.id == post_id)
query.execute()
return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何检测用户是否已经投票?我不确定我该怎么做才能做到这一点.我的计划是,如果我确定用户是否试图再次投票,我会做的只是减少他们之前的投票.
我认为这里最好的方法是创建一个名为Votes的单独表,它将有两列.一个将存储Post的id,另一个将存储User的id.表格中的每个条目或行都算作一票.如果用户尝试对特定帖子进行投票,那么如果存在具有该用户ID的行,则首先查询Votes表.如果它不存在,则添加投票.如果它确实存在,那么您只需删除投票.要获得特定帖子的总投票数,您将再次查询投票表并计算具有给定帖子ID的行数.如果您希望将来添加downvote功能,这也可以使您的应用程序可扩展.
| 归档时间: |
|
| 查看次数: |
718 次 |
| 最近记录: |