亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django Form - 動態切換字段存在

Django Form - 動態切換字段存在

青春有我 2021-09-14 16:27:27
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()


查看完整回答
反對 回復 2021-09-14
  • 1 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號