Cómo restringir a los usuarios que voten por su propio modelo
-
05-07-2019 - |
Pregunta
Estoy usando django-vote como una aplicación de votación para dos de mis modelos. Esos dos modelos tienen campos "autor".
¿Cómo puedo restringir que un usuario vote en un modelo que tiene este usuario en particular configurado como autor sin modificar la aplicación django-vote?
El middleware Django es lo primero que me viene a la mente, pero no entiendo que es "proces_view". función. Si cree que el middleware es la forma correcta, podría dar un ejemplo de cómo hacerlo.
Solución
Agregue este código en cualquier lugar de su settings.py:
from voting.managers import VoteManager
def check_user(func):
def wrapper(self, obj, user, vote):
if obj.user != user:
return func(self, obj, user, vote)
else:
return None
# or raise some exception
return wrapper
VoteManager.record_vote = check_user(VoteManager.record_vote)
No ejecuté este código, tal vez sea incorrecto, pero espero que la idea sea clara
Otros consejos
En lugar de un hack de middleware, ¿por qué no redireccionar las solicitudes a ese URI en particular a través de otra vista? Luego, puede ejecutar la lógica que desee y, posteriormente, llamar a la vista original si corresponde.
Otra idea es utilizar la señal post_save
así:
from django.db.models.signals import post_save
from voting.models import Vote
def check_user(sender, instance, **kwargs):
if instance.user == instance.object.user:
instance.delete()
# do some other stuff to tell the user it didn't work
post_save.connect(check_user, sender=Vote)
El beneficio de hacer esto frente a anular VoteManager.record_vote
es que está menos acoplado estrechamente al módulo de votación, y si hacen cambios es menos probable que rompan su código
editar : como en la respuesta de Glader, debes asegurarte de que todos los objetos sobre los que estás votando tengan un atributo de "usuario".