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.

Foi útil?

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'

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top