Como restringir os usuários votação sobre o seu próprio modelo
-
05-07-2019 - |
Pergunta
Eu estou usando django-voto como uma aplicação de voto para dois dos meus modelos. Esses dois modelos têm campos "autor".
Como posso restringir um usuário de votar em um modelo que tem esse conjunto determinado usuário como autor sem modificar aplicação Django direito a voto?
Django middleware é a primeira coisa que vem à minha mente, mas eu não entendo função que é "proces_view". Se você acha middleware é o caminho certo você poderia dar um exemplo de como fazê-lo.
Solução
Adicione esta em qualquer lugar código em seu 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)
Eu não executar esse código, talvez seja incorreta, mas espero idéia é clara
Outras dicas
Ao invés de um hack middleware, por que não os pedidos Volta pra que determinado URI através de outro ponto de vista? Depois, você pode executa qualquer lógica que você gosta e, posteriormente, chamar a visão original se for o caso.
Outra idéia é usar a sinal post_save
assim:
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)
A vantagem de fazer isso vs substituindo VoteManager.record_vote
é que é menos fortemente acoplado ao módulo de votação, e se eles fazer alterações é menos propensos a quebrar seu código
Editar : como na resposta de Glader, você precisa se certificar de que tudo o que você objetos está votando em ter um atributo 'usuário'
.