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.
Source:stackexchange.com