كيفية تقييد المستخدمين التصويت على نموذجهم الخاص

StackOverflow https://stackoverflow.com/questions/1001856

سؤال

وأستخدمه جانغو الاقتراع كتطبيق التصويت لاثنين من نماذج بلدي. تلك كلا النموذجين لديها حقول "المؤلف".

وكيف يمكنني تقييد المستخدم من التصويت على النموذج الذي لديه هذا مستخدم معين على النحو انها مؤلف دون تعديل التطبيق جانغو الاقتراع؟

وجانغو الوسيطة هي أول ما يتبادر إلى ذهني، لكني لا أفهم انها وظيفة "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