как отлаживать в django, хороший способ?

<p>итак, я начал учиться кодировать в <a href="http://en.wikipedia.org/wiki/python\_%28programming\_language%29">python</a> и позже <a href="http://en.wikipedia.org/wiki/django\_%28web\_framework%29">django</a> . в первый раз было трудно смотреть на трассировки и на самом деле выяснить, что я сделал неправильно и где была синтаксическая ошибка. прошло немного времени, и некоторое время спустя, я думаю, у меня появилась процедура отладки моего кода django. так как это было сделано на ранних этапах моего опыта программирования, я сел и подумал, что, как я это делал, было неэффективно и могло бы быть сделано быстрее. мне обычно удается находить и исправлять ошибки в моем коде, но мне интересно, стоит ли мне делать это быстрее?</p><p>я обычно просто использую отладочную информацию, которую django дает, когда она включена. когда все заканчивается так, как я думал, я сильно нарушаю поток кода из-за синтаксической ошибки и смотрю на переменные в этой точке потока, чтобы выяснить, где код делает что-то отличное от того, что я хотел.</p><p>но можно ли это улучшить? есть ли хорошие инструменты или лучшие способы отладки вашего кода django?</p>

<p>есть множество способов сделать это, но самый простой - просто использовать отладчик <a href="https://docs.python.org/2/library/pdb.html">python</a> . просто добавьте следующую строку в функцию просмотра django:</p><pre><code>import pdb; pdb.set\_trace() </code></pre><p>если вы попытаетесь загрузить эту страницу в своем браузере, браузер зависнет, и вы получите запрос на продолжение отладки при реальном выполнении кода.</p><p>однако есть и другие варианты (я их не рекомендую):</p><pre><code>* return httpresponse({variable to inspect}) * print {variable to inspect} * raise exception({variable to inspect}) </code></pre><p>но отладчик python (pdb) настоятельно рекомендуется для всех типов кода python. если вы уже пользуетесь pdb, вам также следует взглянуть на <a href="http://pypi.python.org/pypi/ipdb/"><strong>ipdb</strong></a> , который использует <a href="http://ipython.org/"><strong>ipython</strong></a> для отладки.</p><p>еще одно полезное расширение для pdb</p><p> <a href="https://pypi.python.org/pypi/pdbpp/"><strong>pdb ++</strong></a> , предложено <a href="https://stackoverflow.com/users/5792269/antash">antash</a> .</p><p> <a href="https://pypi.python.org/pypi/pudb"><strong>pudb</strong></a> , предложено <a href="https://stackoverflow.com/users/5081188/patdujour">patdujour</a> .</p><p> <a href="https://mike.tig.as/blog/2010/09/14/pdb/"><strong>использование отладчика python в django</strong></a> , предложено <a href="https://stackoverflow.com/users/884640/seafangs">seafangs</a> .</p>

<p>мне очень нравится интерактивный отладчик <a href="http://werkzeug.pocoo.org/">werkzeug</a> . это похоже на страницу отладки django, за исключением того, что вы получаете интерактивную оболочку на каждом уровне трассировки. если вы используете <a href="https://github.com/django-extensions/django-extensions">django-extensions</a> , вы получите команду управления <code>runserver\_plus</code>, которая запускает сервер разработки и дает вам отладчик werkzeug для исключений.</p><p>конечно, вы должны запускать это только локально, поскольку это дает любому пользователю с браузером права на выполнение произвольного кода python в контексте сервера.</p>

<p>небольшая подсказка для тегов шаблонов:</p><pre><code>@register.filter def pdb(element): import pdb; pdb.set\_trace() return element </code></pre><p>теперь внутри шаблона вы можете выполнить <code>{{ template\_var|pdb }}</code> и войти в сеанс pdb (если вы работаете на локальном сервере devel), где вы можете проверить <code>element</code> до глубины души.</p><p>это очень хороший способ увидеть, что случилось с вашим объектом, когда он прибывает в шаблон. </p>

<p>я использую <a href="http://www.jetbrains.com/pycharm/">pycharm</a> (тот же движок pydev, что и eclipse). действительно помогает мне визуально пройтись по моему коду и посмотреть, что происходит.</p>

<p>до сих пор почти все было упомянуто, поэтому я только добавлю, что вместо <code>pdb.set\_trace()</code> можно использовать<strong> ipdb.set\_trace () </strong>, который использует ipython и, следовательно, более мощный (автозаполнение и другие полезности). для этого требуется пакет ipdb, поэтому вам нужно только <code>pip install ipdb</code></p>

<p>я вставил <code>django-pdb</code> в <a href="http://pypi.python.org/pypi/django-pdb">pypi</a> . это простое приложение, которое означает, что вам не нужно редактировать исходный код каждый раз, когда вы хотите взломать pdb.</p><p>установка просто ...</p><ol> <li><code>pip install django-pdb</code></li> <li>добавьте <code>'django\_pdb'</code> к своему <code>installed\_apps</code></li> </ol><p>теперь вы можете запустить: <code>manage.py runserver --pdb</code> для разбиения на pdb в начале каждого просмотра ...</p><pre><code>bash: manage.py runserver --pdb validating models... 0 errors found django version 1.3, using settings 'testproject.settings' development server is running at http://127.0.0.1:8000/ quit the server with control-c. get / function "myview" in testapp/views.py:6 args: () kwargs: {} > /users/tom/github/django-pdb/testproject/testapp/views.py(7)myview() -> a = 1 (pdb) </code></pre><p>и запустите: <code>manage.py test --pdb</code>, чтобы разбить pdb на тестовые сбои/ошибки ...</p><pre><code>bash: manage.py test testapp --pdb creating test database for alias 'default'... e ====================================================================== >>> test\_error (testapp.tests.simpletest) ---------------------------------------------------------------------- traceback (most recent call last): file ".../django-pdb/testproject/testapp/tests.py", line 16, in test\_error one\_plus\_one = four nameerror: global name 'four' is not defined ====================================================================== > /users/tom/github/django-pdb/testproject/testapp/tests.py(16)test\_error() -> one\_plus\_one = four (pdb) </code></pre><p>проект размещен на <a href="https://github.com/tomchristie/django-pdb">github</a> , материалы приветствуются, конечно.</p>

<p>самый простой способ отладки python - особенно для программистов, которые привыкли к visual studio - это использование ptvs (python tools for visual studio). шаги просты: </p><ol> <li>загрузите и установите его с <a href="http://pytools.codeplex.com/">http://pytools.codeplex.com/</a> </li> <li>установите точки останова и нажмите f5. </li> <li>ваша точка останова достигнута, вы можете просматривать/изменять переменные так же просто, как отлаживать программы на c #/c++. </li> <li>это все :) </li> </ol><p>если вы хотите отладить django с помощью ptvs, вам нужно сделать следующее: </p><ol> <li>в настройках проекта - вкладка «общие» установите «startup file» на «manage.py», точку входа в программу django. </li> <li>в настройках проекта - вкладка «отладка» установите «аргументы скрипта» на «runserver --noreload». ключевым моментом здесь является «--noreload». если вы не установите его, ваши контрольные точки не будут достигнуты. </li> <li>наслаждайся этим.</li> </ol>

<p>я использую <a href="http://www.pydev.sourceforge.net/">pydev</a> с eclipse действительно хорошо, устанавливаю точки останова, шагаю в код, просматриваю значения любых объектов и переменных, пробую это.</p>

<p>я использую <a href="http://www.jetbrains.com/pycharm/">pycharm</a> и поддерживаю его до конца. это стоило мне немного, но я должен сказать, что преимущество, которое я получаю от этого, бесценно. я попробовал отладку с консоли, и я очень благодарен людям, которые могут это сделать, но для меня возможность визуальной отладки моих приложений - это здорово.</p><p>я должен сказать, однако, <a href="http://www.jetbrains.com/pycharm/">pycharm</a> действительно занимает много памяти. но опять же, ничего хорошего в жизни не бывает свободным. они только что вышли с последней версией 3. она также очень хорошо работает с django, flask и google appengine. в общем, я бы сказал, что это отличный удобный инструмент для любого разработчика.</p><p>если вы еще не используете его, я бы порекомендовал получить пробную версию на 30 дней, чтобы взглянуть на возможности pycharm. я уверен, что есть и другие инструменты, такие как aptana. но я думаю, мне просто нравится, как выглядит pycharm. я чувствую себя очень комфортно, отлаживая свои приложения там.</p>

<p>с моей точки зрения, мы могли бы разбить общие задачи <em>отладка кода</em> на три различных шаблона использования:</p><ol> <li>кое-что <strong>вызвало исключение</strong>: <a href="https://github.com/django-extensions/django-extensions">runserver\_plus</a> 'werkzeug отладчик на помощь. возможность запуска пользовательского кода на всех уровнях трассировки является убийцей. и если вы полностью застряли, вы можете создать gist, чтобы поделиться с одним щелчком мыши.</li> <li>страница отображается, но результат <strong>неверен</strong>: снова werkzeug качается. чтобы создать точку останова в коде, просто введите <code>assert false</code> в том месте, где вы хотите остановиться.</li> <li><strong>код работает неправильно</strong>, но быстрый просмотр не помогает. скорее всего, алгоритмическая проблема. вздох. затем я обычно запускаю консольный отладчик <a href="https://pypi.python.org/pypi/pudb">pudb</a> : <code>import pudb; pudb.set\_trace()</code>. основное преимущество перед [i] pdb заключается в том, что pudb (несмотря на то, что вы выглядите как 80-е годы) делает настройку пользовательских выражений часов на одном дыхании. и отладка группы вложенных циклов намного проще с графическим интерфейсом.</li> </ol><p>ах, да, горе шаблонов. наиболее распространенная (для меня и моих коллег) проблема - это неправильный контекст: либо у вас нет переменной, либо у вашей переменной нет какого-либо атрибута. если вы используете <a href="https://github.com/django-debug-toolbar/django-debug-toolbar">панель инструментов отладки</a> , просто проверьте контекст в разделе «шаблоны» или, если этого недостаточно, установите разрыв в коде ваших представлений сразу после того, как ваш контекст заполнен.</p><p>такие вот дела.</p>

<p>иногда, когда я хочу изучить конкретный метод и вызывать pdb просто слишком громоздко, я бы добавил:</p><pre><code>import ipython; ipython.embed() </code></pre><p><code>ipython.embed()</code> запускает оболочку ipython, которая имеет доступ к локальным переменным с того места, где вы ее вызываете. </p>

<p>я только что нашел wdb ( <a href="http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2egde\_25827\_member\_255996401">http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2egde\_25827\_member\_255996401</a> ). он имеет довольно приятный пользовательский интерфейс/gui со всеми прибамбасами. автор говорит это о wdb -</p><p>«существуют ide, такие как pycharm, которые имеют свои собственные отладчики. они предлагают схожий или равный набор функций ... однако, чтобы использовать их, вы должны использовать эти конкретные ide (а некоторые из них не являются бесплатными или могут быть доступны не для всех платформы). выберите правильный инструмент для ваших нужд. "</p><p>думаю, я просто передам это.</p><p><strong>также очень полезная статья о отладчиках python:</strong> <a href="https://zapier.com/engineering/debugging-python-boss/">https://zapier.com/engineering/debugging-python-boss/</a> </p><p><strong>наконец</strong>, если вы хотите увидеть отличную графическую распечатку вашего стека вызовов в django, проверьте: <a href="https://github.com/joerick/pyinstrument">https://github.com/joerick/pyinstrument</a> . просто добавьте pyinstrument.middleware.profilermiddleware в middleware\_classes, затем добавьте? profile в конец url-адреса запроса, чтобы активировать профилировщик. </p><p>можно также запустить pyinstrument из командной строки или путем импорта в качестве модуля.</p>

<p>я настоятельно рекомендую epdb (extended python debugger). </p><p> <a href="https://bitbucket.org/dugan/epdb">https://bitbucket.org/dugan/epdb</a> </p><p>одна вещь, которая мне нравится в epdb для отладки django или других веб-серверов python, это команда epdb.serve (). это устанавливает трассировку и передает ее на локальный порт, к которому вы можете подключиться. типичный вариант использования:</p><p>у меня есть мнение, что я хочу пройти через шаг за шагом. я вставлю следующее в тот момент, когда я хочу установить трассировку.</p><pre><code>import epdb; epdb.serve() </code></pre><p>как только этот код выполняется, я открываю интерпретатор python и подключаюсь к обслуживающему экземпляру. я могу проанализировать все значения и пройтись по коду, используя стандартные команды pdb, такие как n, s и т.д.</p><pre><code>in [2]: import epdb; epdb.connect() (epdb) request <wsgirequest path:/foo, get:<querydict: {}>, post:<questdict: {}>, ... > (epdb) request.session.session\_key 'i31kq7lljj3up5v7hbw9cff0rga2vlq5' (epdb) list 85 raise some\_error.customerror() 86 87 # example login view 88 def login(request, username, password): 89 import epdb; epdb.serve() 90 -> return my\_login\_method(username, password) 91 92 # example view to show session key 93 def get\_session\_key(request): 94 return request.session.session\_key 95 </code></pre><p>и многое другое, что вы можете узнать о вводе справки epdb в любое время.</p><p>если вы хотите обслуживать или подключаться к нескольким экземплярам epdb одновременно, вы можете указать порт для прослушивания (по умолчанию 8080). то есть.</p><pre><code>import epdb; epdb.serve(4242) >> import epdb; epdb.connect(host='192.168.3.2', port=4242) </code></pre><p>хост по умолчанию «localhost», если не указан. я добавил это здесь, чтобы продемонстрировать, как вы можете использовать это для отладки чего-то другого, кроме локального экземпляра, например сервера разработки в вашей локальной сети. очевидно, что если вы сделаете это, будьте осторожны, так как заданная трассировка никогда не попадет на ваш рабочий сервер!</p><p>в качестве краткого примечания, вы все равно можете сделать то же самое, что и принятый ответ с помощью epdb (<code>import epdb; epdb.set\_trace()</code>), но я хотел бы выделить функциональность подачи, поскольку я нашел его таким полезным.</p>

<p>я использую <a href="http://www.jetbrains.com/pycharm/">pycharm</a> и различные инструменты отладки. также есть хорошие статьи о том, как легко настроить эти вещи для новичков. <a href="http://garmoncheg.blogspot.com/2013/06/django-how-to-debug-django.html">вы можете начать здесь.</a> рассказывает об отладке pdb и gui в целом с проектами django. надеюсь, что кто-то извлечет из них пользу.</p>

<p>добавьте <code>import pdb; pdb.set\_trace()</code> в соответствующую строку в коде python и выполните его. выполнение остановится с помощью интерактивной оболочки. в командной консоли вы можете выполнить код python (например, переменные печати) или использовать такие команды, как:</p><ul> <li><code>c</code> продолжить исполнение</li> <li><code>n</code> шаг к следующей строке в той же функции</li> <li><code>s</code> переход к следующей строке в этой функции или вызываемой функции</li> <li><code>q</code> выйти из отладчика/выполнения</li> </ul><p>также смотрите: <a href="https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28">https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28</a> </p>

<p>если вы используете aptana для разработки django, посмотрите это: <a href="http://www.youtube.com/watch?v=qqh-uqfltjq">http://www.youtube.com/watch?v=qqh-uqfltjq</a> </p><p>если нет, подумайте об использовании.</p>

<p>для тех, кто может случайно добавить pdb в живые коммиты, я могу предложить следующее расширение ответа #koobz:</p><pre><code>@register.filter def pdb(element): from django.conf import settings if settings.debug: import pdb pdb.set\_trace() return element </code></pre>

<p>большинство опций уже упоминалось . чтобы напечатать контекст шаблона, я создал для этого простую библиотеку . см. <a href="https://github.com/edoburu/django-debugtools">https://github.com/edoburu/django-debugtools</a> </p><p>вы можете использовать его для печати контекста шаблона без какой-либо конструкции <code>{% load %}</code>:</p><pre><code>{% print var %} prints variable {% print %} prints all </code></pre><p>он использует настраиваемый формат pprint для отображения переменных в теге <code><pre></code>.</p>

<p>я нахожу, что visual studio code отлично подходит для отладки приложений django. стандартные параметры python launch.json запускают <code>python manage.py</code> с подключенным отладчиком, поэтому вы можете устанавливать точки останова и шагать по своему коду по своему усмотрению.</p>

<p>один из лучших вариантов отладки кода django - через wdb: <a href="https://github.com/kozea/wdb">https://github.com/kozea/wdb</a> </p><blockquote> <p>wdb работает с python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) и pypy. более того, можно отлаживать программу на python 2 с сервером wdb, работающим на python 3, и наоборот или отлаживать программу, запущенную на компьютере с сервером отладки, работающим на другом компьютере, внутри веб-страницы на третьем компьютере! \_\_. более того, теперь возможно приостановить текущий запущенный процесс/поток python, используя внедрение кода из веб-интерфейса. (для этого требуются gdb и ptrace) другими словами, это очень улучшенная версия pdb прямо в вашем браузере с функциями nice.</p> </blockquote><p>установите и запустите сервер, и в своем коде добавьте:</p><pre><code>import wdb wdb.set\_trace() </code></pre><p>по мнению автора, основными отличиями в отношении <code>pdb</code> являются:</p><blockquote> <p>для тех, кто не знает проект, wdb - это отладчик python, такой как pdb, но с отличным веб-интерфейсом и множеством дополнительных функций, таких как:</p> <ul> <li>подсветка синтаксиса источника </li> <li>визуальные точки останова </li> <li>интерактивное завершение кода с использованием джедая </li> <li>постоянные точки останова </li> <li>глубокая проверка объектов с помощью мыши поддержка многопоточности/многопроцессорности</li> <li>удаленная отладка</li> <li>смотреть выражения </li> <li>в редакции кода отладчика </li> <li>интеграция популярных веб-серверов в случае ошибки </li> <li>в случае прерывания исключения во время трассировки (не после вскрытия), например, в отличие от отладчика werkzeug</li> <li>взлом в запущенных в настоящий момент программах посредством внедрения кода (в поддерживаемых системах)</li> </ul> </blockquote><p>у него отличный браузерный пользовательский интерфейс. радость в использовании! :)</p>

<p>я настоятельно рекомендую использовать pdb.</p><pre><code>import pdb pdb.set\_trace() </code></pre><p>вы можете проверить все значения переменных, перейти к функции и многое другое . <a href="https://docs.python.org/2/library/pdb.html">https://docs.python.org/2/library/pdb.html</a> </p><p>для проверки всех видов запросов, ответов и обращений к базе данных. я использую django-debug-toolbar <a href="https://github.com/django-debug-toolbar/django-debug-toolbar">https://github.com/django-debug-toolbar/django-debug-toolbar</a> </p>

<p>как уже упоминалось в других постах, здесь - установка точек останова в вашем коде и просмотр кода, чтобы увидеть, ведет ли он себя так, как вы ожидали, - отличный способ изучить что-то вроде django, пока вы не поймете, как все это ведет себя - и каков ваш код делается.</p><p>для этого я бы рекомендовал использовать wingide. как и в других упомянутых средах разработки. отличный и простой в использовании, удобный макет, а также простота установки точек останова, оценка/изменение стека и т.д. идеально подходит для визуализации того, что делает ваш код, когда вы проходите через него. я большой поклонник этого.</p><p>также я использую pycharm - он имеет отличный статический анализ кода и может иногда помочь обнаружить проблемы, прежде чем вы поймете, что они есть.</p><p>как уже упоминалось, django-debug-toolbar имеет важное значение - <a href="https://github.com/django-debug-toolbar/django-debug-toolbar">https://github.com/django-debug-toolbar/django-debug-toolbar</a> </p><p>и хотя это явно не инструмент отладки или анализа - одним из моих любимых является <strong>промежуточное программное обеспечение для печати</strong>, доступное в django snippets по адресу <a href="https://djangosnippets.org/snippets/290/">https://djangosnippets.org/snippets/290/</a> </p><p>это отобразит запросы sql, сгенерированные вашим представлением. это даст вам хорошее представление о том, что делает orm, и если ваши запросы эффективны или вам нужно переработать код (или добавить кеширование).</p><p>я считаю его бесценным для отслеживания производительности запросов при разработке и отладке моего приложения. </p><p>еще один совет - я немного изменил его для собственного использования, чтобы показывать только сводку, а не оператор sql .... поэтому я всегда использую его при разработке и тестировании. я также добавил, что если len (connection.queries) больше, чем предопределенный порог, отображается дополнительное предупреждение.</p><p>затем, если я улавливаю что-то плохое (с точки зрения производительности или количества запросов), я возвращаюсь к полному отображению операторов sql, чтобы точно увидеть, что происходит. очень удобно, когда вы работаете над большим проектом django с несколькими разработчиками.</p>

<p>во время разработки добавляем быстрый</p><pre><code>assert false, value </code></pre><p>может помочь диагностировать проблемы в представлениях или где-либо еще, без необходимости использовать отладчик.</p>

<p>исходя из собственного опыта, есть два пути:</p><ol> <li><p>использовать <a href="https://pypi.org/project/ipdb/">ipdb</a> , который является расширенным отладчиком, любит pdb.</p> <p><code>import ipdb;ipdb.set\_trace()</code></p></li> <li><p>используйте django shell, просто используйте команду ниже. это очень полезно, когда вы разрабатываете новый вид.</p> <p><code>python manage.py shell</code></p></li> </ol>

<p>дополнительное предложение. </p><p>вы можете использовать<strong> тесты носа </strong>и<strong> pdb </strong>вместе, скорее добавляя <code>pdb.set\_trace()</code> в свои представления вручную. преимущество состоит в том, что вы можете наблюдать ошибки при их первом запуске, возможно, в стороннем коде.</p><p>вот ошибка для меня сегодня.</p><pre><code>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 %} </code></pre><p>теперь я знаю, что это означает, что я обманываю конструктор для формы, и у меня даже есть хорошее представление о том, какое поле является проблемой. но можно ли использовать pdb, чтобы увидеть, на что жалуются хрустящие формы,<strong> внутри шаблона </strong>?</p><p>да, я могу. использование параметра <em>--pdb</em> при тестировании носа:</p><p><code>tests$ nosetests test\_urls\_catalog.py --pdb</code></p><p>как только я нажимаю на любое исключение (в том числе обработанное изящно), pdb останавливается там, где это происходит, и я могу посмотреть вокруг.</p><pre><code> 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) </code></pre><p>теперь ясно, что мой аргумент выбора для хрустящего конструктора поля был как список внутри списка, а не как список/кортеж кортежей.</p><pre><code> 'choices': [[('\_', 'any type'), (7, (7, 'type 7', 'rectype\_table'))]] </code></pre><p>замечательно то, что этот pdb находится в коде crispy, а не в моем, и мне не нужно было вставлять его вручную.</p>

<p>используйте <code>pdb</code> или <code>ipdb</code>. разница между этими двумя аспектами заключается в том, что ipdb поддерживает автозаполнение.</p><p>для pdb</p><pre><code>import pdb pdb.set\_trace() </code></pre><p>для ipdb</p><pre><code>import ipdb ipdb.set\_trace() </code></pre><p>для выполнения новой строки нажмите клавишу <code>n</code>, для продолжения нажмите клавишу <code>c</code> . проверьте дополнительные параметры с помощью <code>help(pdb)</code></p>