2017-03-16 36 views
0

我正在使用帶有信號的django 1.6。 我有模型Events與字段is_cyclic,我想運行信號只爲一個,當前對象。但似乎我的代碼經過的所有對象,我得到一個錯誤:僅針對當前對象的呼叫信號

maximum recursion depth exceeded while calling a Python object 

這裏是我的信號

@receiver(post_save, sender=Events) 
def my_callback(sender, created, instance, *args, **kwargs): 
    db_name = args[0] if len(args) else 'events' 
    print('using %s' % db_name) 
    list = loader.get_template('events/event_list_item.html') 
    list_small = loader.get_template('events/event_list_item_small.html') 
    setattr(instance, 'is_cyclic', list.render(Context({'e': instance}))) 
    setattr(instance, 'is_cyclic', list_small.render(Context({'e': instance}))) 
    instance.save(using=db_name) 

回答

2

你讀過你的代碼?您有一個函數調用Event.save(),並將其綁定到Event模型的models.post_save()信號。

models.post_save()保存模型實例後發送信號。因此,當您的回撥呼叫instance.save()時,它會觸發post_save信號,該信號調用您的回調函數,該函數保存實例,該實例會觸發post_save信號,該信號調用您的回調函數,該函數保存實例,該實例會觸發post_save信號,回調函數等等等等。

你真的很幸運,Python限制遞歸到給定的深度,否則這將永遠遞歸。

一個側面說明:

  • 你不」需要setattr()在這裏,你可以只使用明顯instance.is_cyclic = <whatever>屬性賦值語法
  • 要設置相同屬性的兩個不同的值,第一個是IOW第一個setattr調用純粹是浪費時間
  • 我真的不明白你爲什麼要將模板渲染的結果賦給實例屬性(如果你想緩存,Django有滿特色緩存框架已經)
  • 我完全不明白你爲什麼會這樣分配給它的名稱屬性意味着一些布爾標誌
+0

好:)謝謝你開我的眼睛:) – Mark