Django发出信号以识别调用哪个视图
我有一个有两种不同观点的模型 问题是我有一个注册到模型的信号,我想根据视图所称的对象保存方法更改信号的行为 有没有办法做到这一点 简单的回答是:不 更详细的回答:从技术上讲,你可以检查堆栈,但你真的不想进行这种肮脏的黑客攻击。如果需要特定的每个视图行为,请在视图中执行,如果需要考虑此行为,请在视图明确调用的函数中执行Django发出信号以识别调用哪个视图,django,Django,我有一个有两种不同观点的模型 问题是我有一个注册到模型的信号,我想根据视图所称的对象保存方法更改信号的行为 有没有办法做到这一点 简单的回答是:不 更详细的回答:从技术上讲,你可以检查堆栈,但你真的不想进行这种肮脏的黑客攻击。如果需要特定的每个视图行为,请在视图中执行,如果需要考虑此行为,请在视图明确调用的函数中执行 另外,对于FWIW,信号的要点是允许应用程序之间的解耦-更具体地说,允许您的应用程序连接到其他应用程序的第三部分,而无需接触其他应用程序代码 内置信号由django本身处理,因此,
另外,对于FWIW,信号的要点是允许应用程序之间的解耦-更具体地说,允许您的应用程序连接到其他应用程序的第三部分,而无需接触其他应用程序代码 内置信号由django本身处理,因此,如果不想检查调用方,只能通过向信号传递额外标志来实现:
def first_view(request):
#...
model_instance._through_view = 'first'
model_instance.save()
#...
def second_view(request):
#...
model_instance._through_view = 'second'
model_instance.save()
#...
对于你的信号:
@receiver(pre_save, sender=MyModel)
def pre_save_handler(sender, instance, created, **kwargs):
through_view = getattr(instance, '_through_view' None)
if through_view == 'first':
...
elif through_view == 'second':
...
虽然您的解决方案在技术上是正确的,但如果OP这样做,那么等待他将是一场维护噩梦。实际上,正如我链接到的文章中所解释的,在应用程序自己的模型上使用模型信号已经是一种反模式了。@Brunodesshuilliers是的,我在某种程度上同意,但有时我们只是想让事情正常运行:还有其他更好的方法,设置起来并不复杂,这不会影响项目的可维护性。相反,在意大利面条上加番茄酱并不能使它更容易清理。