문제

Django-Voting을 두 모델의 투표 신청서로 사용하고 있습니다. 이 두 모델에는 필드 "저자"가 있습니다.

Django-Voting 앱을 수정하지 않고이 특정 사용자를 작성자로 설정 한 모델에서 사용자가 투표하는 것을 어떻게 제한 할 수 있습니까?

Django Middleware는 내 마음에 가장 먼저 오는 것이지만 "Proces_view"기능이라는 것을 이해하지 못합니다. 미들웨어가 올바른 방법이라고 생각한다면 어떻게 해야하는지에 대한 예를 들어 주시기 바랍니다.

도움이 되었습니까?

해결책

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)

이 코드를 실행하지 않았는데 아마도 틀렸을 수도 있지만 아이디어가 명확 해지기를 바랍니다.

다른 팁

미들웨어 해킹 대신 다른 견해를 통해 해당 URI에 대한 요청을 다시 경주하지 않겠습니까? 그런 다음 원하는 논리를 수행 한 다음 적절한 경우 원본보기를 호출 할 수 있습니다.

또 다른 아이디어는 post_save 신호

그렇게 :

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)

이 작업의 이점 vs 우발적 인 이점 VoteManager.record_vote 투표 모듈과 덜 결합되어 있고 변경하면 코드를 끊을 가능성이 적습니다.

편집하다: Glader의 답변에서와 같이, 투표하는 모든 객체에 '사용자'속성이 있는지 확인해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top