在Django中发生错误时呈现管理表单

时间:2011-06-16 20:36:35

标签: 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                  <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>

以下是我的模型的样子:

class Circuit(CommonFields):
  """Circuit class model."""
  vid = models.AutoField(primary_key=True)
  vname = models.CharField(
      'Vendor Name',
      max_length=100,
      null=True,
      blank=True)
  vspc = models.ForeignKey(
      Room,
      db_column='avspc',
      verbose_name='Space',
      null=True,
      blank=True)

这是我自定义表单的自定义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语句,我的表单可以成功提交,但是,当我提出错误时,它会给我上述错误。

如果出现错误,我有什么想法可以渲染我的表单?

请注意,仅当我创建新条目而未设置可选字段或编辑未设置可选字段的条目时,才会出现此错误。如果我正在编辑具有这些可选字段集的现有条目,如果我取消设置可选字段,则不会给出任何错误。

1 个答案:

答案 0 :(得分:0)

@GeoffroyCALA是对的,你需要条件来引发异常。如果不检查条件,则无论如何都会引发异常。此外,您不指定为其设置自定义异常的表单字段。请参阅docs example

尝试类似的东西:

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