Saltar al contenido

¿Cómo implemento una función de botón Me gusta para las publicaciones en Python Flask?

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *