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
提交
取消