2011-01-20 15 views
5

पर ऑडिटिंग मैं किसी भी मॉडल पर किस क्षेत्र में बदलाव आया है (यानी मॉडल स्तर पर ऑडिट, क्योंकि यह अधिक परमाणु है, प्रशासन/फॉर्म-स्तर पर नहीं, जैसे कि django और django-reversion पहले से ही कर सकता है)। मैं प्री/पोस्ट सेव/डिलीट सिग्नल का उपयोग कर किसी भी क्षेत्र के लिए ऐसा करने में सक्षम हूं। हालांकि, मुझे एम 2 एम क्षेत्र में ऐसा करने में समस्या है।Django: m2m_changed सिग्नल के साथ कई से कई क्षेत्रों में परिवर्तनों का पता नहीं लगा सकता - मॉडल-स्तर

नीचे दिए गए कोड नमूने के लिए, मैं उपयोगकर्ता परिवर्तन फ़ॉर्म में 'custom_groups' m2m फ़ील्ड को परिभाषित करता हूं क्योंकि यह एक रिवर्स रिलेशनशिप है। जब उपयोगकर्ता व्यवस्थापक इंटरफ़ेस पर फ़ॉर्म सहेजता है उदाहरण के लिए, यदि मैं 'custom_groups' फ़ील्ड में कोई परिवर्तन करता हूं तो मैं लॉग इन करना चाहता हूं।

मॉडल:

from django.contrib.auth.models import User 

class CustomGroup(models.Model): 
    users = models.ManyToManyField(User, related_name='custom_groups') 

ModelForm:

class CustomUserChangeForm(UserChangeForm): 
    custom_groups = forms.ModelMultipleChoiceField(required=False, queryset=CustomGroup.objects.all()) 

m2m_changed संकेत का उपयोग कर के साथ समस्या यह है कि मैं जांच नहीं कर सकता क्या वास्तव में मामले के लिए बदल गया है जहां M2M क्षेत्र असाइनमेंट ऑपरेटर का उपयोग करके अपडेट किया गया है:

user.custom_groups = self.cleaned_data['custom_groups'] 

ऐसा इसलिए है क्योंकि आंतरिक रूप से django सभी ऑब्जेक्ट्स मैन्युअल रूप से जोड़ने से पहले, कस्टम_ग्रुप * पर एक स्पष्ट() निष्पादित करेगा। यह पूर्व/पोस्ट-साफ़ निष्पादित करेगा और फिर m2m फ़ील्ड पर पूर्व/पोस्ट सहेजें।

क्या मैं यह सब गलत तरीके से कर रहा हूं? क्या कोई आसान तरीका है जो वास्तव में काम कर सकता है?

धन्यवाद!

+0

यहां मेरा समाधान है http://stackoverflow.com/questions/1221878/why-does-django-post-save-signal-give-me-pre-save-data/9172783#9172783 – Fatih

उत्तर

12

मुझे एक ही समस्या थी और मुझे लगता है कि मैं इसे हल कर सकता हूं। मैं कैसे आप m2m_changed उपयोग कर रहे हैं पता नहीं है, लेकिन यह models.py पर होना चाहिए और कुछ इस तरह के समान होना चाहिए:

signals.m2m_changed.connect(your_function, sender=CustomGroup.users.through) 

अब, मैं एक signals.py कि समारोह फ़ाइल बनानी होगी, और निम्न कोड आपको आपके द्वारा चुने गए विकल्पों को मुद्रित करना चाहिए:

def your_function(sender, instance, action, reverse, model, pk_set, **kwargs): 
    if action == 'post_add': 
     for val in pk_set: 
      print val 

अब, आप अपडेट किए गए मानों को जानते हैं। मुझे उम्मीद है कि यह आपकी समस्या का समाधान कर सकता है।

संबंधित मुद्दे