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.

War es hilfreich?

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

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top