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.

¿Fue útil?

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".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top