Django 当form.is_valid()=False且表单重新加载时,字段值丢失

Django 当form.is_valid()=False且表单重新加载时,字段值丢失,django,django-forms,Django,Django Forms,我正在表单中手动呈现ModelChoiceField,以便可以在每个选项上插入自定义属性。当存在任何形式的表单字段错误阻止提交时,当重新加载页面时,用户输入/选择的数据将丢失(即字段值恢复为第一次加载页面时的值)。我想知道当表单错误迫使页面/表单重新加载时,如何防止丢失这些信息)注意:这仅影响以如下所示方式手动渲染的字段 forms.py self.fields['formpricing'].choices = ZERO_BLANK_CHOICE + tuple([(t.id, t) for t

我正在表单中手动呈现ModelChoiceField,以便可以在每个选项上插入自定义属性。当存在任何形式的表单字段错误阻止提交时,当重新加载页面时,用户输入/选择的数据将丢失(即字段值恢复为第一次加载页面时的值)。我想知道当表单错误迫使页面/表单重新加载时,如何防止丢失这些信息)注意:这仅影响以如下所示方式手动渲染的字段

forms.py

self.fields['formpricing'].choices = ZERO_BLANK_CHOICE + tuple([(t.id, t) for t in FormPricingMethod.objects.filter(industryname=industry)])
self.fields['formpricing'].queryset = FormPricingMethod.objects.filter(industryname=industry)
formpricing = userprofile.formpricing 
form = BasisOfPricingForm(request.POST or None, user=user, initial={'formpricing': formpricing})
视图.py

self.fields['formpricing'].choices = ZERO_BLANK_CHOICE + tuple([(t.id, t) for t in FormPricingMethod.objects.filter(industryname=industry)])
self.fields['formpricing'].queryset = FormPricingMethod.objects.filter(industryname=industry)
formpricing = userprofile.formpricing 
form = BasisOfPricingForm(request.POST or None, user=user, initial={'formpricing': formpricing})
模板

<select name="formpricing" required="" id="id_formpricing">

{% for value, object in form.formpricing.field.choices %}

   <option 
          typenumber="{{object.typenumber}}" 
          value="{{value}}"
          {% if form.formpricing.initial.id == value %}
               selected
          {% endif %}

    >
      {{object.title}}
  </option>

 {% endfor %} 

</select>

{%表示值,对象形式为.formpricing.field.choices%}
{{object.title}}
{%endfor%}

谢谢

找到了答案。在form.is_valid==False节中,您必须

a) 从表单中获取字段值。如果formpricing字段包含无效值并且是表单验证失败的原因,则需要Try语句

        try:
            formpricing = form3.cleaned_data['formpricing']
        except:
            pass
b) 重新初始化表单

form = BasisOfPricingForm(request.POST or None, user=user, initial={'formpricing': formpricing})

initial
应该不是必需的。请参阅,特别是此注释:“如果表单是使用
POST
请求提交的,则视图将再次创建表单实例并使用请求中的数据填充它:
form=NameForm(request.POST)
这称为“将数据绑定到表单”(现在是绑定表单)。”调用
form.is\u valid()
和将
POST
数据绑定到表单实例的行为应该正确。不幸的是,当您以我描述的方式手动呈现字段时,情况并非如此。按照正常方式呈现的字段(即{form.carselection}})由于另一个字段引起的错误而在重新加载页面时保留用户输入。”“手动”呈现的字段没有将数据绑定到表单,因此我不得不手动从表单中提取数据,然后在重新呈现之前将其作为上下文传递到表单中。这是一种非常糟糕的模式。如果您确实坚持手动呈现字段,则可以从
form.field.value
获取值。重新初始化整个表单意味着您将丢失错误消息。嗨,丹尼尔,这是一个很好的观点。我再看看这个。再次感谢你的帮助!