2

2 つのモデルの投票アプリケーションとして django-voting を使用しています。これらの両方のモデルには「作成者」フィールドがあります。

django-voting アプリを変更せずに、この特定のユーザーが作成者として設定されているモデルにユーザーが投票するのを制限するにはどうすればよいですか?

Django ミドルウェアが最初に頭に浮かぶのですが、それが "proces_view" 関数であることがわかりません。ミドルウェアが正しい方法だと思われる場合は、その方法の例を挙げてください。

4

3 に答える 3

4

このコードを 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)

私はこのコードを実行しませんでした。間違っているかもしれませんが、アイデアが明確であることを願っています

于 2009-06-16T17:08:14.193 に答える
2

ミドルウェアのハッキングではなく、別のビューを介してその特定の URI にリクエストを再ルーティングしてみませんか? 次に、好きなロジックを実行し、その後、必要に応じて元のビューを呼び出すことができます。

于 2009-06-16T14:53:00.857 に答える
0

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

于 2009-06-19T14:46:56.470 に答える