2010-01-31 32 views
16

Tengo un formset en línea para un modelo, que tiene una restricción unique_together. Y así, cuando los datos de entrada, que no cumple esta limitación, se muestra:Django: Mostrar correctamente los errores de formset

__all__Please correct the duplicate values below.

El código, que hace esto es:

{% for error in formset.errors %} 
     {{ error }}<br/> 
    {% endfor %} 

No me importa mucho como el __all__ al principio del error y es muy claramente la clave de diccionario, así que he intentado:

{% for key, error in formset.errors %} 
     {{ key }}: {{ error }}<br/> 
    {% endfor %} 

Pero entonces todo lo que consigo es:

__all__:

{{error}} no se mostrará en absoluto. Entonces, ¿qué está pasando aquí? ¿Y cómo visualizo el error correctamente?

Respuesta

24

Creo que el problema aquí es que formset.errors es una lista de diccionarios, ni un solo diccionario.

Desde el Django docs page on formsets:

>>> formset.errors 
[{}, {'pub_date': [u'This field is required.']}] 

Ver si algo como esto soluciona el problema: (actualiza basándose en los comentarios Askers)

{% for dict in formset.errors %} 
    {% for error in dict.values %} 
     {{ error }} 
    {% endfor %} 
{% endfor %} 

Si eso no funciona, me gustaría probar usando manage.py shell, e intenta reproducir tu situación en el caparazón de pitón ... de esa manera será fácil inspeccionar los diversos valores y descubrir lo que tienes que hacer.

+0

Gracias :) útil. Tu manera no funcionó, pero finalmente funcionó con una pequeña modificación (errors.values ​​en lugar de errores), por lo que ahora se ve así: {% for dict in formset.errors%} {% for error en dict.values%} {{error}} {% endfor%} {% endfor%} –

+0

Me alegro de poder ayudar. He actualizado mi respuesta en base a sus comentarios. Parece que el problema clave que estaba estropeando antes era que 'formset.errors' es una lista de dicts, ni una sola dict. –

+0

Para la versión actual de django, el bucle de errores en las plantillas generalmente no es lo que desea. Dado que OP preguntó al final "... ¿cómo puedo mostrar el error correctamente?", Me referiría a las otras respuestas que no implican el bucle de errores. – dsalaj

5

El bucles son innecesarias, estos errores se deben visualizarse correctamente con lo siguiente:

{{ formset.non_form_errors }} 
2

Django 1.6 formsets tienen un nuevo método, BaseFormSet.total_error_count. Usar esto en una plantilla condicional asegura que solo generará errores y marcas si existe al menos un error en el formset.

{% if formset.total_error_count %} 
    <ul class="errorList"> 
    {% for dict in formset.errors %} 
     {% for error in dict.values %} 
     <li>{{ error }}</li> 
     {% endfor %} 
    {% endfor %} 
    </ul> 
{% endif %} 

Véase el Django docs page para v1.6 +.

0

Aquí es una aclaración para cualquier persona encontrarse con problemas similares de errores no se queden en la plantilla:

Si usted tiene y error con respecto al juego de formularios en su conjunto, el uso:

{{ formset.non_form_errors }} 

esto básicamente devuelve errores en __all__ entrada desde formset.errors.Está documentado como:

""" 
    Returns an ErrorList of errors that aren't associated with a particular 
    form -- i.e., from formset.clean(). Returns an empty ErrorList if there 
    are none. 
    """ 

Sin embargo, si se renderiza, formas de juego de formularios y algunos errores no está siendo renderd, es probable que echa en falta:

{% for form in formset.forms %} 
    {# ... #} 
    {{ form.non_field_errors }} 
{% endfor %} 

Esto devuelve errores en la entrada de __all__form.errors. Esos son, análogos al non_form_errors, los errores que no están asociados con un campo particular, sino con las relaciones de campo. Por ejemplo, si tiene un formulario con campos From y To y validar si From valor es más pequeño que To valor, la etiqueta {{ form.non_field_errors }} podría hacer que el siguiente error:

'The From value must be smaller than the To value' 
+0

Si desea establecer usted mismo el valor formset.non_form_errors, use la siguiente sintaxis 'formset._non_form_errors =" mi mensaje de error "' (Observe el guión bajo antes de non_form_errors) – Ben

Cuestiones relacionadas