Рендеринг форм администратора при возникновении ошибки в Django - PullRequest
3 голосов
/ 17 июня 2011

У меня есть модель, которая содержит поле с внешним ключом, и это поле может быть 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)

А вот мой custom 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

Обратите внимание, что если я удаляю оператор повышения, мои формы могут быть успешно отправлены, однако, когда я выдаю ошибку, она выдает мне вышеуказанную ошибку.

Есть идеи, как я могу обработать мою форму, если в ней есть ошибка?

Обратите внимание, что эта ошибка возникает только тогда, когда я создаю новую запись без установки дополнительного поля или при редактировании записи, для которой не установлены дополнительные поля. Если я редактирую существующую запись, в которой установлены эти необязательные поля, если я отменяю необязательные поля, это не выдает никакой ошибки.

1 Ответ

0 голосов
/ 18 сентября 2011

@ GeoffroyCALA прав, вам нужно условие, чтобы вызвать исключение.Если вы не проверяете условие, исключение все равно будет возбуждено.Более того, вы не указываете поле формы, для которого вы устанавливаете пользовательское исключение.См. Пример docs .

Попробуйте что-то подобное:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...