Eine zusätzliche Anregung.
Sie können Folgendes nutzen nosetests y pdb zusammen, sondern injizieren pdb.set_trace()
in Ihren Ansichten manuell. Der Vorteil ist, dass Sie Fehlerbedingungen beobachten können, wenn sie zum ersten Mal auftreten, 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 %}
Nun, ich weiß, dass dies bedeutet, dass ich den Konstruktor für das Formular verpfuscht habe, und ich habe sogar eine gute Vorstellung davon, welches Feld ein Problem ist. Aber, kann ich pdb verwenden, um zu sehen, was crispy Formen beschwert sich über, innerhalb einer Vorlage ?
Ja, das kann ich. Mit dem --pdb Option bei Nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Sobald ich auf eine Ausnahme stoße (einschließlich derjenigen, die ordnungsgemäß behandelt werden), hält pdb an der Stelle an, an der es passiert, und ich kann mich umsehen.
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, es ist klar, dass meine Entscheidungen Argument für die knusprigen Feld Konstruktor war, wie es eine Liste innerhalb einer Liste war, anstatt eine Liste/Tupel von Tupeln.
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
Das Schöne daran ist, dass dieses pdb im Code von crispy stattfindet, nicht in meinem, und ich es nicht manuell einfügen musste.
3 Stimmen
Ich verwende gerne django-debug-toolbar, es ist sehr praktisch
3 Stimmen
Oder verwenden Sie den in Visual Studio Code integrierten Python-Debugger, wie hier beschrieben code.visualstudio.com/docs/python/tutorial-django