2009-06-16 4 views
2

내 모델 중 두 곳에서 django-voting을 투표 신청으로 사용하고 있습니다. 이 두 모델에는 필드 "author"가 있습니다.사용자가 자신의 모델로 투표를 제한하는 방법

django-vote 응용 프로그램을 수정하지 않고이 특정 사용자를 작성자로 설정 한 모델의 사용자 투표를 제한하려면 어떻게합니까?

장고 미들웨어가 내 마음에 오는 첫 번째 일이지만, "proces_view"기능을 이해하지 못합니다. 만약 당신이 미들웨어가 올바른 방법이라고 생각한다면 어떻게해야 할 지 보여줄 수 있습니까?

답변

4

어디서나 settings.py에이 코드를 추가합니다

과 같이 :

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) 

overr 대이 일의 장점 iding VoteManager.record_vote은 덜 단단 투표 모듈에 결합 점이다, 그들은 변경하는 경우는

가 편집 코드를 깰 가능성이 낮아 : Glader의 대답에, 당신은 모든 개체 당신이있어 있는지 확인해야 투표는 '사용자'속성을가집니다.

+0

네, 그 아이디어는 분명합니다. 그리고 그것은 효과적입니다. 나중에 참조 할 때이 코드는 settings.py에 넣을 수 없습니다. 그것을 settings.py를 제외하고 확실하게 실행될 파일에 넣으십시오. 예를 들어 응용 프로그램의 models.py에 있습니다. – aleksandar

+0

나는 이것이 이것을하는 더 좋은 방법이라고 생각한다. 이 방법은 AJAX 호출을 위해 작성된 논리이기도하며 한 곳에서 사용할 수 있습니다. – aleksandar

+0

'user'속성이없는 프로젝트에서 투표 할 수있는 객체가있는 경우이 코드를주의하십시오. 이 경우 hasattr (obj, 'user') 체크를 추가하거나 try ... except AttributeError로 모든 것을 감쌀 필요가있다. –

2

미들웨어 해킹이 아니라 다른보기를 통해 특정 URI로 요청을 다시 라우팅하지 않는 이유는 무엇입니까? 그런 다음 원하는 논리를 수행 한 다음 적절한 경우 원본보기를 호출 할 수 있습니다. 어쩌면 그것이 잘못이다,

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) 

가이 코드를 실행하지 않은,하지만 난 생각이 또 다른 아이디어는 post_save signal를 사용하는 것입니다 분명

+0

그게 내가 한 짓이다.) – Jiaaro

+0

이것은 처음부터 그렇게하지 않은 이유를 알기에는 너무도 명백하다. 두 답이 모두 정확합니다. 어느 것을 받아 들일 것인가? – aleksandar

+0

이 접근법의 단점은 투표중인 객체를 가져 오기 위해 추가 데이터베이스 쿼리를 작성해야하며, 그러면 장고 - 투표 자체보기 내에서 반복됩니다. 그래서 다른 솔루션은 더 효율적이고 DRY입니다.하지만이 솔루션은 monkeypatching을 필요로하지 않습니다. –

관련 문제