如果我删除其中一个字段中的字段,然后返回到第一个视图,则在两个视图中重复使用表单会以错误的顺序呈现字段

时间:2013-10-12 20:36:07

标签: django django-forms django-crispy-forms

我对表单有一个奇怪的问题,在渲染表单时重用两个视图中的表单会产生奇怪的行为。

我有一个表单,我在两个视图中重用,一个视图使用一个表单,因为它是第二个删除一个字段,因为我在url中提供该字段的值。他们后来又回到了第一个观点。

如果你使用django-crispy-forms来渲染你的表单,这尤其令人讨厌。

代码:

第一个观点:

def get_form(self, form_class):
    return super(BaseSale, self).get_form(form_class)

第二种观点:

def get_form(self, form_class):
    form = super(BaseSale, self).get_form(form_class)
    del form.fields['price']
    return form

以下是用户案例:

首先请求,我在view1中渲染formA First request, I render formA in view1

第二个请求,我在view2中渲染formA,但删除了一个不打算使用的字段。 Second request, I render formA in view2, but remove a field that is not intended to be use

第三个请求,我再次在view1中渲染formA,我在view2中删除的字段是存在的,但是字段的顺序是错误的。

Third request, I render formA in view1 again, the field I remove in view2 is there, but the order of the fields is wrong.

这必须与不是线程安全的表单有关,但我无法调试它。

有任何解决此问题的想法吗?

1 个答案:

答案 0 :(得分:0)

不确定这会解决问题,但您可能希望使用当前类调用super。在您的代码示例中,您可以在两个视图中调用super(BaseSale, self)。复制/粘贴后你忘了解决这个问题吗?

其次,最好使用不同的表单类。如果你想重用表单的某些部分,那么添加一个基本表单类并根据需要多次扩展它。

最后,如果您需要动态表单,那么最好将表单构建逻辑封装到表单中。您可以在__init__方法中添加/删除字段。