Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django发出信号以识别调用哪个视图_Django - Fatal编程技术网

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是的,我在某种程度上同意,但有时我们只是想让事情正常运行:还有其他更好的方法,设置起来并不复杂,这不会影响项目的可维护性。相反,在意大利面条上加番茄酱并不能使它更容易清理。