我使用pycharm来调试django开发服务器,以分析我使用表单类继承的表单实例。
如果我在没有进入任何断点的情况下运行我的应用程序(暂时禁用所有断点),那么一切正常。
如果我在某个断点处停止,则实例化的表单会产生不同的结果。
特别是我有两个多选字段,有时只有一个或两个都没有绑定到初始值。
我可以从调试器中看到设置field['field_name'].initial = value
的代码部分已执行,但我随机得到field['field_name'].initial == None
。
我的watches
面板为空,因此我没有意外修改任何值的风险。
这对我来说很奇怪!为什么代码执行会因为步进或不进入某些断点而发生变化?
什么可能导致这种奇怪的行为?
修改
经过多次检查后,我将错误限制在此块中:
class MyForm(BaseForm):
period = forms.ChoiceField()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['period'].choices = self.get_choices()
方法get_choices
返回一个动态计算的选项列表,但即使用静态列表更改它也不会改变结果。
事实上,每当我执行更新,因此我使用MyForm
和data
参数实例化instance
时会发生以下情况:
self.fields['period'].choices = self.get_choices()
,那么一切正常 编辑2:
一般来说,这似乎发生在我踩到修改字段属性的行的任何时候,例如:
self.fields['period'].choices = self.get_choices()
self.fields['thingy'].initial = 'hello'
我是如此无能为力。要么pycharm被窃听,要么Django有一些奇怪的观察者模式,如果访问了值A,它会改变值B,即使看起来很难,但这似乎不太可能......