Wie beschränken Anwender auf ihr eigenes Modell abstimmen
-
05-07-2019 - |
Frage
Ich bin mit django-Voting als stimmberechtigter Anwendung für zwei meiner Modelle. Diese beiden Modelle haben Felder „Autor“.
Wie kann ich einen Benutzer beschränken auf einem Modell von der Abstimmung, die diesen bestimmten Benutzer, wie es der Autor gesetzt hat, ohne django-Voting App zu modifizieren?
Django Middleware ist das erste, was mir in den Sinn kommt, aber ich verstehe nicht, dass es „proces_view“ -Funktion. Wenn Sie denken, Middleware ist der richtige Weg könnten Sie bitte ein Beispiel geben, wie es zu tun.
Lösung
Fügen Sie diesen Code überall in Ihrem 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)
Ich habe diesen Code nicht ausgeführt, vielleicht ist es falsch, aber ich hoffe Idee klar
Andere Tipps
Eher als eine Middleware-Hack, warum Umleiten von Anfragen nicht auf diese bestimmte URI durch eine andere Ansicht? Dann können Sie führt, was Logik, die Sie mögen, und anschließend die ursprüngliche Ansicht falls nennen.
Eine weitere Idee ist es, das post_save Signal
zu verwenden,wie folgt:
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)
Der Vorteil dieses vs überwiegendem VoteManager.record_vote
zu tun, ist, dass es weniger ist eng an das Abstimmungsmodul gekoppelt ist, und wenn sie Änderungen vornehmen, es ist weniger wahrscheinlich, dass der Code brechen
Bearbeiten : wie in Glader Antwort, müssen Sie sicherstellen, dass alle Objekte, die Sie auf haben sind Abstimmung ein ‚Nutzer‘ Attribut
.