Записи по тегу “python”.

Django: изменение поля стандартного вида

Всем снова привет. Как это ни странно сейчас все мое внимание уделено исключительно разработке приложений основанных на web framework Django. Причиной перехода на django является разработке и ведению нового проекта, который наша компания делает для украинской компании. Надеюсь что мы выиграем с этим проектом.

Но это всего лишь отступление. Важной частью разработки является кастомизация некоторых элементов любого сайта использующих какой-бы то ни было фреймворк. Будь то Smarty, Zend Framework, Symphony. Без разницы, все они предоставляют строгий набор элементов, которые используются в проекте. А что делать если нас не устраивает этот набор и необходимо пополнить его своими причиндалами.

В django 1.0 были сделаны некоторые очень полезные добавления, которых я ждал. Введение save_model метода в ModelAdmin класс избавило от написания менеджеров. Что же дает нам ModelAdmin для кастомизации полей?

Любой вам даст совет рыть исходники Django, и что собственно и было сделано. В ModelAdmin есть метод get_form который вернет экземпляр класса формы которая используется в административном интерфейсе. А что если переопределить эту функцию? Выйдет примерно следующее

  1. class MyModelAdmin(admin.ModelAdmin):
  2.     list_display = (‘title’, ‘latin_title’, ‘recipe’)
  3.     prepopulated_fields = {"url": ("latin_title", )}
  4.    
  5.     form = MyModelAdminForm
  6.        
  7.     def get_form(self, request, obj=None, **kwargs):
  8.         form = super(MyModelAdmin, self).get_form(request, obj=None, **kwargs)
  9.        
  10.         form.base_fields[‘custom’].widget = MyWidget(obj)
  11.         return form
  12.    
  13. admin.site.register(Medicine, MedicineAdmin)

То что доктор прописал, не так ли? Данного подхода в документации я не нашел, зато на сайте http://djangosnippets.org есть отличный пример, который использует подобную технику.

Отладка Django приложений в PyDev Eclipse

У меня получилось задебажить свое django приложение в Eclipse. И поэтому делюсь опытом с вами.

Что нам необходимо?

1. Среда разработки – Eclipse
2. Web framework – Django
3. Psyco
4. PyDev

Что нам нужно сделать?

1. Запустить Eclipse. Ставить PyDev рассказывать не буду и уж точно как django подымать у меня для вас язык не подвернется сказать. Дальнейшее рассказывается только с учетом того, что вы поставили все 4 компоненты и имеете уже созданный в Эклипсе проект

2. В меню Eclipse выбираем Run и Open Run Dialog…

3. Создаем новую конфигурацию Python Run. Называем ее как угодно, на рисунке у меня изображена пустая форма.

4. Вам необходимо заполнить диалог значениями. На рисунке пример рабочей конфигурации.

Но это не все, переходим на вкладку Arguments и вводим в поле Program arguments вот такую строку

runserver –noreload

Кто работает с django поймет что если нажать run то это будет эквивалентно manage.py runserver –noreload в командной строке, аля терминале ну или консоли (кому как нравится, я лично называю это консолью или терминалом) Жмем Run чтобы убедиться что все сделали правильно.

Все гуд и теперь смело можем открывать в браузере localhost:8000 и работать с проектом.

Но мы ведь не для того начали всю эту пляску. Мы хотим нормально работающий дебаггер. Поэтому продолжим. Что нам для этого надо? Объясняю как я вышел на дебаг. Логика простая. Если запускается сервер то должен запускаться и дебаггер. Хех. Жму в меню Run -> Open Debug Dialog… и выбираю созданную конфигурацию, Debug, облом…

Psyco not available for debugger speedups

Ну видимо PyDev уже позаботился о нас и поддерживает какой-то пакет, который по каким-то причинам не доступен. Если вы скачали уже его, то поставьте. Как ставить? На ваших плечах, у меня на Mac OS X я успешно скомпилил пакет и установил. Чего и вам советую. Простите меня, пользователи Windows =)

После всех мучений с установкой psyco, открываем manage.py нашего проекта и делаем воот такие изменения в нем

  1. #!/usr/bin/env python
  2. from django.core.management import execute_manager
  3. try:
  4.     import settings # Assumed to be in the same directory.
  5. except ImportError:
  6.     import sys
  7.     sys.stderr.write("Error: Can’t find the file ’settings.py’ in the directory containing %r. " +
  8.                      "It appears you’ve customized things.\nYou’ll have to run django-admin.py, " +
  9.                      "passing it your settings module.\n(If the file settings.py does indeed exist, "+
  10.                      "it’s causing an ImportError somehow.)\n" % __file__)
  11.     sys.exit(1)
  12.  
  13. if __name__ == "__main__":
  14.     import psyco
  15.     psyco.full()
  16.     execute_manager(settings)

Теперь запускаем дебагер и вуаля, без ошибок, ставим куда нить breakpoint и перезапускаем сервер. Открываем браузер, заходим на localhost:8000 и если все получилось удачно, то нас Eclipse спросит: ”А не открыть ли нам Debug перспективу?”

Какие минусы я заметил,

1. Во время сессии нельзя поставить новый брекпойнт, для это придется перезапускать консоль.
2. При таком подходе вы не сможете стартовать приложение из нормальной консоли. Чтобы это сделать, вам придется убрать те самые заветные две строки.

Остальное меня вполне устроило.