Después de tanto luchar ya hallamos la contestación de esta cuestión que algunos lectores de nuestro sitio han presentado. Si deseas aportar algún detalle no dejes de dejar tu comentario.
Solución:
class User(UserMixin, db.Model):
# Code
liked = db.relationship(
'PostLike',
foreign_keys='PostLike.user_id',
backref='user', lazy='dynamic')
def like_post(self, post):
if not self.has_liked_post(post):
like = PostLike(user_id=self.id, post_id=post.id)
db.session.add(like)
def unlike_post(self, post):
if self.has_liked_post(post):
PostLike.query.filter_by(
user_id=self.id,
post_id=post.id).delete()
def has_liked_post(self, post):
return PostLike.query.filter(
PostLike.user_id == self.id,
PostLike.post_id == post.id).count() > 0
class PostLike(db.Model):
__tablename__ = 'post_like'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
@app.route('/like//')
@login_required
def like_action(post_id, action):
post = Post.query.filter_by(id=post_id).first_or_404()
if action == 'like':
current_user.like_post(post)
db.session.commit()
if action == 'unlike':
current_user.unlike_post(post)
db.session.commit()
return redirect(request.referrer)
Luego, cuando esté enumerando sus publicaciones, configure sus anclas de la siguiente manera:
% for post in posts %
% if current_user.has_liked_post(post) %
Unlike
% else %
Like
% endif %
% endfor %
Supongamos que su Post
modelo se ve algo como esto:
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
recipient_id = db.Column(db.Integer, db.ForeignKey('user.id'))
likes = db.relationship('PostLike', backref='post', lazy='dynamic')
Usarías:
p = Post.query.filter_by(id=1).first()
p.likes.count()
O bien, usaría esto en su archivo .html:
% for post in posts %
% if current_user.has_liked_post(post) %
Unlike
% else %
Like
% endif %
post.likes.count() likes
% endfor %
Te mostramos las reseñas y valoraciones de los lectores
Recuerda que te permitimos agregar una reseña si hallaste tu obstáculo justo a tiempo.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)