Python Django中发生错误时呈现管理表单
我有一个模型,其中包含一个带有外键的字段,该字段可以为NULL,并且是可选的。如果此字段没有值,我可以在管理页面中保存此表单,而不会出现任何问题。但是,当我的表单出现错误时,无法呈现我的表单,Django返回以下错误:Python Django中发生错误时呈现管理表单,python,django,forms,foreign-keys,render,Python,Django,Forms,Foreign Keys,Render,我有一个模型,其中包含一个带有外键的字段,该字段可以为NULL,并且是可选的。如果此字段没有值,我可以在管理页面中保存此表单,而不会出现任何问题。但是,当我的表单出现错误时,无法呈现我的表单,Django返回以下错误: Caught ValueError while rendering: need more than 0 values to unpack on line 19 9 {% for field in line %} 10
Caught ValueError while rendering: need more than 0 values to unpack on line 19
9 {% for field in line %}
10 <div{% if not line.fields|length_is:'1' %} class="field-box{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>
11 {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
12 {% if field.is_checkbox %}
13 {{ field.field }}{{ field.label_tag }}
14 {% else %}
15 {{ field.label_tag }}
16 {% if field.is_readonly %}
17 <p>{{ field.contents }}</p>
18 {% else %}
19 {{ field.field }}
20 {% endif %}
21 {% endif %}
22 {% if field.field.field.help_text %}
23 <p class="help">{{ field.field.field.help_text|safe }}</p>
24 {% endif %}
25 </div>
26 {% endfor %}
27 </div>
28 {% endfor %}
29 </fieldset>
这是我的自定义表单的自定义clean():
def clean(self):
"""Custom port range validator."""
super(CircuitForm, self).clean()
raise forms.ValidationError("Some stupid error just happened.")
cleaned_data = self.cleaned_data
return cleaned_data
请注意,如果我删除raise语句,我的表单可以成功提交,但是,当我提出错误时,它会给出上述错误
你知道当我的表单有错误的时候,我该如何呈现它吗
请注意,只有在创建新条目而未设置可选字段或编辑未设置可选字段的条目时,才会发生此错误。如果我正在编辑设置了这些可选字段的现有条目,如果我取消设置这些可选字段,它不会给出任何错误 @GeoffroyCALA是对的,您需要条件来引发异常。如果不检查条件,则仍将引发异常。此外,您没有指定为其设置自定义异常的表单字段。看 试试这样:
def clean(self):
"""Custom port range validator."""
cleaned_data = self.cleaned_data
if cleaned_data['vpc'] not in Room.objects.values_list('id', flat=True): # FOR EXAMPLE
raise forms.ValidationError("Some stupid error just happened.")
super(CircuitForm, self).clean()
return cleaned_data
我真的把它修好了。我使用字典在init方法中手动初始化这些字段,而我必须使用如下元组列表:[(“”,“--Select-->”)。很抱歉给您带来不便。如果您能将其添加到答案中,然后将其标记为正确,这将有助于其他有类似问题的人。我发现您的clean方法存在问题。在引发ValidationError之前,您一定忘记了if子句,无论您的数据是什么,这个clean方法都会引发ValidationError。也许只是打字错误?
def clean(self):
"""Custom port range validator."""
cleaned_data = self.cleaned_data
if cleaned_data['vpc'] not in Room.objects.values_list('id', flat=True): # FOR EXAMPLE
raise forms.ValidationError("Some stupid error just happened.")
super(CircuitForm, self).clean()
return cleaned_data