質問

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の答えのように、投票するすべてのオブジェクトに「ユーザー」属性があることを確認する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top