Una sugerencia adicional.
puede aprovechar nosetests y AP juntos, en lugar de inyectar pdb.set_trace()
en sus puntos de vista de forma manual. La ventaja es que puede observar las condiciones de error cuando comienzan, potencialmente en un código de terceros.
He aquí un error para mí hoy.
TypeError at /db/hcm91dmo/catalog/records/
render_option() argument after * must be a sequence, not int
....
Error during template rendering
In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18
19 {% if field|is_checkboxselectmultiple %}
20 {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21 {% endif %}
22
23 {% if field|is_radioselect %}
24 {% include 'bootstrap3/layout/radioselect.html' %}
25 {% endif %}
26
27 {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28
{% if field|is_checkbox and form_show_labels %}
Ahora, sé que esto significa que metí la pata al constructor de la forma, e incluso tengo una buena idea de qué campo es un problema. Pero, ¿puedo usar pdb para ver de qué se están quejando las formas crujientes, dentro de una plantilla?
Sí, puedo. El uso de la opción --pdb en nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Tan pronto como llegué a ninguna excepción (incluyendo los manejados con gracia), paradas pdb donde pasa y puedo mirar a su alrededor.
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
return self.as_widget()
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
return force_text(widget.render(name, self.value(), attrs=attrs))
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
options = self.render_options(choices, [value])
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{ 'attrs': { 'class': 'select form-control'},
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
'is_required': False}
(Pdb)
Ahora, es claro que mi opciones argumento del constructor de campo crujiente era como era una lista dentro de una lista, en lugar de una lista/tupla de tuplas.
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
Lo bueno es que este pdb está teniendo lugar en el código de crujiente, no el mío y yo no tenía necesidad de insertar manualmente.
+1 por sugerir pdb. Sin embargo, vale la pena señalar que esto solo funciona cuando se usa el servidor de desarrollo en su máquina local, ya que el aviso aparecerá en la consola. –
Ver también [django-pdb] (http://pypi.python.org/pypi/django-pdb) según mi respuesta a continuación. Te da los comandos 'manage.py runserver --pdb' y' manage.py test --pdb'. –
@Daniel, consulte [rconsole] (http://code.google.com/p/rfoo/) para tener una consola en una instancia ya en ejecución de python. – Phob