为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信