Django Form - 动态切换字段存在

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?


青春有我
浏览 179回答 1
1回答

白衣非少年

如前所述在这里,你不应该修改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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python