ユーザーが自分のモデルで投票することを制限する方法
-
05-07-2019 - |
質問
2つのモデルの投票アプリケーションとして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シグナル
を使用することですそのように:
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)
これを行うことと VoteManager.record_vote
をオーバーライドすることの利点は、投票モジュールとの結合が弱くなり、変更を加えた場合にコードが破損する可能性が低くなることです
編集:Gladerの答えのように、投票するすべてのオブジェクトに「ユーザー」属性があることを確認する必要があります。
所属していません StackOverflow