发生错误时在Django中渲染管理员表单

3 投票
1 回答
649 浏览
提问于 2025-04-16 19:44

我有一个模型,其中有一个外键字段,这个字段可以是空的,而且是可选的。如果这个字段没有值,我可以在管理页面顺利保存这个表单。但是,当我的表单出现错误时,表单无法显示,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

@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

撰写回答