首页 文章

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

提问于
浏览
3

我有一个包含带外键的字段的模型,该字段可以为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

    @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
    

相关问题