Saran tambahan.
Anda dapat memanfaatkan nosetests dan pdb secara bersamaan, alih-alih menyuntikkan pdb.set_trace()
dalam pandangan Anda secara manual. Keuntungannya adalah Anda dapat mengamati kondisi kesalahan saat pertama kali dimulai, berpotensi dalam kode pihak ketiga.
Ini kesalahan untuk saya hari ini.
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 %}
Sekarang, saya tahu ini berarti bahwa saya menyia-nyiakan konstruktor untuk formulir, dan saya bahkan punya ide bagus tentang bidang mana yang menjadi masalah. Tapi, bisakah saya menggunakan pdb untuk melihat bentuk renyah apa yang dikeluhkan, di dalam templat ?
Ya saya bisa. Menggunakan opsi --pdb di nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Segera setelah saya menemukan pengecualian (termasuk yang ditangani dengan anggun), pdb berhenti di tempat itu terjadi dan saya bisa melihat-lihat.
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)
Sekarang, sudah jelas bahwa argumen pilihan saya ke konstruktor bidang renyah adalah seperti daftar di dalam daftar, bukan daftar / tupel tupel.
'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]
Yang rapi adalah pdb ini terjadi di dalam kode crispy, bukan milikku dan aku tidak perlu memasukkannya secara manual.