django

2012-12-13 4 views
8

में प्री_डिलेट सिग्नल का उपयोग करके मेरे ऐप में मैं हटाए जा रहे सभी प्रश्नों का ट्रैक रखना चाहता हूं। और इसलिए मैंने अपनी मॉडल फ़ाइल में एक वर्ग (तालिका) बनाई है।django

class Deleted(models.Model): 
question = models.IntegerField(null=True, blank=True)#id of question being deleted 
user = models.IntegerField(null=True, blank=True)#id of user deleting the question 
dt = models.DateTimeField(null=True, blank=True)#time question is deleted 

एक उपयोगकर्ता एक सवाल यह हटाना समारोह कहा जाता है को नष्ट करने का प्रयास करता:

def delete_questions(request, user, questions): 
    for q in questions: 
     q.delete() 

मेरे संदेह मैं कैसे Django नई तालिका मैं बनाया है पॉप्युलेट करने के लिए की एक pre_delete संकेत कर सकते हैं।

~ नौसिखिया की कोशिश कर मोटी कार्य ~ अग्रिम :) धन्यवाद

+2

आपको वास्तव में क्या परेशानी है? क्या आपने संकेतों के बारे में दस्तावेज पढ़ा है? https://docs.djangoproject.com/en/dev/topics/signals/ –

उत्तर

26

आप बंद को परिभाषित करते हुए शुरू receiver आप उपयोग करना चाहते:

def log_deleted_question(sender, instance, using, **kwargs): 
    d = Deleted() 
    d.question = instance.id 
    d.dt = datetime.datetime.now() # consider using auto_now=True in your Deleted definition 
    # not sure how you'd get the user via a signal, 
    # since it can happen from a number of places (like the command line) 
    d.save() 

फिर अपने रिसीवर डेकोरेटर को परिभाषित:

from django.db.models.signals import pre_delete 
from django.dispatch import receiver 

@receiver(pre_delete, sender=Question, dispatch_uid='question_delete_log') 

इसे पूरी तरह से जोड़ें:

from django.db.models.signals import pre_delete 
from django.dispatch import receiver 

@receiver(pre_delete, sender=Question, dispatch_uid='question_delete_signal') 
def log_deleted_question(sender, instance, using, **kwargs): 
    d = Deleted() 
    d.question = instance.id 
    d.dt = datetime.datetime.now() 
    d.save() 

आप इस फ़ंक्शन को अपनी models.py फ़ाइल में डाल सकते हैं, क्योंकि आप जानते हैं कि यह लोड हो जाएगा और सही तरीके से कनेक्ट हो जाएगा।

समस्या हालांकि, यह है कि आप उपयोगकर्ता को हटाने का अनुरोध नहीं करते हैं। चूंकि डिलीगो एपीआई (कमांड लाइन, शैल इत्यादि) से एक डिलीट ट्रिगर किया जा सकता है, जिसके पास इसके साथ कोई अनुरोध नहीं है। इस कारण से, यदि आप पूरी तरह से महत्वपूर्ण हैं कि आप उपयोगकर्ता को डिलीट के साथ स्टोर करते हैं तो आप सिग्नल का उपयोग करने से बचना चाहेंगे।

+0

उत्तर देने के लिए धन्यवाद :) लेकिन @Josh "कक्षा हटाया गया" मैंने रखा है वह तालिका है जिसे मैंने नव निर्मित किया है ताकि वे मूल्यों के साथ पॉप्युलेट हो जाएं , और मुझे इसके बारे में परेशानी थी। आपने जो कहा वह बहुत अच्छा लग रहा है, कोशिश की लेकिन यह कहा कि django.core.signals आयात से आयात नहीं किया जा सकता है pre_delete आयात किया है इसलिए मैंने django.db.models.signals आयात pre_delete से आयात करने का प्रयास किया। फिर फिर से शिकायत हुई कि रिसीवर आयात नहीं कर सका .. इसे गुगल करने का प्रयास किया लेकिन जैसा कि सुझाव दिया गया है, मैं django के अन्य संस्करणों को बदल या हटा नहीं सकता .. इसके लिए कोई कामकाज? और एक संदेह- उपयोगकर्ता आईडी के लिए हम उपयोग नहीं कर सकते (तर्क प्रदान करते हैं) –

+0

पुन: विशिष्ट उपयोगकर्ता, मैं कुछ जवाब पाने की उम्मीद कर रहा हूं और इस http://stackoverflow.com/questions/6847952/django-determine के आसपास हो गया -विच-उपयोगकर्ता-हटाना-कब-उपयोग-पोस्ट-डिलीट-सिग्नल .. यह पता लगाने की कोशिश कर रहा है कि यह मेरे संदर्भ को कैसे फिट करता है :) –

+0

मैं Django 1.2 का उपयोग कर रहा हूं और इसलिए एक समस्या reg थी। रिसीवर में सुधार। मैं ओवरकैम कि post_delete.connect (my_callback_func, sender = mymodel) का उपयोग करके, हालांकि मुझे हटाए गए उपयोगकर्ता को प्राप्त करने में परेशानी हो रही है, क्या आप मुझे जमानत दे सकते हैं :) –