Ein zusätzlicher Vorschlag.
Sie können Nosetests und PDF zusammen nutzen, anstatt pdb.set_trace()
Ihre Ansichten manuell einzufügen . Der Vorteil ist, dass Sie Fehlerbedingungen beim ersten Start beobachten können, möglicherweise im Code von Drittanbietern.
Hier ist ein Fehler für mich heute.
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 %}
Jetzt weiß ich, dass dies bedeutet, dass ich den Konstruktor für das Formular vermasselt habe, und ich habe sogar eine gute Vorstellung davon, welches Feld ein Problem ist. Aber kann ich pdb verwenden, um zu sehen, worüber sich knusprige Formen innerhalb einer Vorlage beschweren ?
Ja, ich kann. Mit Hilfe der --pdb Option auf nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Sobald ich auf eine Ausnahme stoße (einschließlich solcher, die ordnungsgemäß behandelt wurden), stoppt pdb dort, wo es passiert, und ich kann mich umschauen.
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)
Nun ist es klar, dass mein Auswahlargument für den knusprigen Feldkonstruktor darin bestand, dass es sich um eine Liste innerhalb einer Liste handelte und nicht um eine Liste / ein Tupel von Tupeln.
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
Das Schöne ist, dass diese PDF-Datei im Code von crispy stattfindet, nicht in meinem, und ich musste sie nicht manuell einfügen.