[Django]-Django: Duplicate action when I press Follow or Unfollow button

2👍

The main problem is that you wrote symmetrical='false' as a string literal, and the truthiness of that string is, well, True. You should use the False constant, so symmetrical=False.

But you are overcomplicating things. Django is perfectly capable to handle a ManyToManyField [Django-doc] in the two directions.

Indeed, we can define this as:

class User(AbstractUser):
    seguidores = models.ManyToManyField(
        'self', symmetrical=False, related_name='seguidos', blank=True
    )

So here if A adds B to the seguidores, then A will appear in the seguidos of B, so it is automatically reflecting that.

So the view then is simplified to:

def seguir(request):
    if request.method == 'POST':
        accion = request.POST.get('accion')
        usuario_accion = request.POST.get('usuario')
        usuario = request.user.username

        # Comprobación de si ya lo esta siguiendo y recuperación de información de usuarios
        perfil_usuario = User.objects.get(username=usuario)
        perfil_usuario_accion = User.objects.get(username=usuario_accion)
        esta_siguiendo = perfil_usuario.seguidos.filter(
            username=usuario_accion
        ).exists()

        if accion == 'follow':

            # Si no lo esta siguiendo se añade a la lista de seguidos de uno y de seguidores del otro
            if not esta_siguiendo:
                perfil_usuario_accion.seguidores.add(perfil_usuario)

            # Redirección a la página del usuario seguido
            return render(
                request,
                "network/profile.html",
                {"profile_user": perfil_usuario_accion, "logged_user": 0},
            )

        else:

            # Comprobación de que lo siga
            if esta_siguiendo:
                perfil_usuario.seguidos.remove(perfil_usuario_accion)
                perfil_usuario_accion.seguidores.remove(perfil_usuario)

            return render(
                request,
                "network/profile.html",
                {"profile_user": perfil_usuario_accion, "logged_user": 0},
            )

and the template remains the same.

Leave a comment