当Django出现错误时如何呈现管理员表单

3

我有一个模型,其中包含一个外键字段,这个字段可以为空并且是可选的。如果这个字段没有值,我可以在管理员页面上保存这个表单而没有任何问题。然而,当我的表单出现错误时,我的表单无法渲染,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 语句,则我的表单可以成功提交,但是当我引发错误时,它会给我上面的错误。
有什么想法可以在表单中出现错误时呈现我的表单?
请注意,仅当我创建新条目而未设置可选字段或编辑未设置可选字段的条目时,才会出现此错误。如果我正在编辑已设置这些可选字段的现有条目,如果我取消设置可选字段,则不会出现任何错误。

我最终修复了它。我在__init__方法中手动使用字典初始化那些字段,而我应该使用类似这样的元组列表:[("", "--选择--") ]。对此给您带来的不便深感抱歉。 - mohi666
3
如果您能将其放入答案中并将其标记为正确,这将有助于其他遇到类似问题的人。 - James Khoury
1
我看到你的clean方法有问题。在引发ValidationError之前,你可能忘记了if子句,这个clean方法将始终引发ValidationError,无论你的数据是什么。也许只是一个打字错误? - Geoffroy CALA
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接