Python 2.7.8 和 Django==1.4.2(旧版应用)几个月前,我在调查 Django 项目中的错误时遇到了一个令人困惑的问题。我相信这与 Django 池线程的方式有关,但真的很难确定。这是重现此问题的最小可行示例:class FormA(Form): field_a = CharField() def __init__(self, *args, **kwargs): if kwargs['initial']['test']: self.base_fields['field_b'] = CharField() super(FormA, self).__init__(*args, **kwargs)class ViewA(FormView): template_name = 'test' form_class = FormA def get_initial(self): initial = super(ViewA, self).get_initial() initial['test'] = self.request.GET.get('test')当根据查询参数动态添加新字段时,如果首先发出查询参数test评估为 True的请求,则field_b将包含在 FormA 中。但是,我怀疑对于所有连续的请求(即使测试评估为 False),FormA 都会保留field_b。造成这种情况的解决方法是POP或删除field_b从self.base_fields,然后评估测试变量。这有效,但我不完全确定为什么需要它。def __init__(self, *args, **kwargs): self.base_fields.pop('field_b', 0) if kwargs['initial']['test']: self.base_fields['field_b'] = CharField() super(FormA, self).__init__(*args, **kwargs)看起来, base_fields dict 在多个请求中持续存在。所以这提出了以下几点:1) 为什么 base_fields dict 没有在每个请求上重新初始化?2)是否有更好的解决方案来解决这个问题,而不是在 base_fields 上执行 pop/del?3)如果没有其他解决方案,pop/del会导致竞争条件吗?如果两个请求同时发出会怎样——一个请求是否会弄乱另一个请求的 base_fields?
1 回答
白衣非少年
TA贡献1155条经验 获得超0个赞
如前所述在这里,你不应该修改base_fields的实例。
解决方案:
class FormA(Form):
field_a = CharField()
def __init__(self, *args, **kwargs):
# this will populate `self.fields`
super(FormA, self).__init__(*args, **kwargs)
if kwargs['initial']['test']:
self.fields['field_b'] = CharField()
添加回答
举报
0/150
提交
取消