2017-03-16 54 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