我正在使用django-voting作爲我的兩個模型的投票應用程序。這兩種模式都有「作者」字段。如何限制用戶對自己的模型進行投票
如何限制用戶在沒有修改Django-voting應用程序的情況下對具有此特定用戶設置的模型進行投票?
Django中間件是我首先想到的,但我不明白它是「proces_view」函數。如果您認爲中間件是正確的方式,請舉例說明如何去做。
我正在使用django-voting作爲我的兩個模型的投票應用程序。這兩種模式都有「作者」字段。如何限制用戶對自己的模型進行投票
如何限制用戶在沒有修改Django-voting應用程序的情況下對具有此特定用戶設置的模型進行投票?
Django中間件是我首先想到的,但我不明白它是「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 signal
像這樣:
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 OVERR的好處iding VoteManager.record_vote
是,它不太緊密耦合的投票模塊,如果他們做出改變它不太可能破壞你的代碼
編輯:在Glader的答案,你需要確保所有的對象你投票有一個'用戶'屬性。
這就是我所做的;) – Jiaaro 2009-06-16 15:29:34
這是如此明顯,我不知道爲什麼我沒有做到這一點。兩個答案都是正確的。哪個接受:)? – aleksandar 2009-06-18 10:58:28
這種方法的缺點是您將不得不進行額外的數據庫查詢來獲取被投票的對象,然後在django-voting自己的視圖中重複該對象。所以另一種解決方案更加高效和乾燥,儘管這不需要monkeypatching。 – 2009-06-18 23:35:28