Posts

Showing posts from 2012

Кастомізація полів у Джанго адмінці

Якщо нам недостатньо автоматичного налаштування форматування полів форми редагування сутності (адмінка), то в Джанго для цього приводу існує декілька цікавиз можливостей. Загалом, для початку, слід сказати, що форматувати поля допомагають спеціальні класи, які називаються widget И Пошукайте файл widgets.py - він розпоовість вам багато цікавого. Отже завдання: Збільшити поле, яке дозволяє вибирати декілька варіантів (віддзеркалює зв’язок ManyToMany в базі данних, а клас форми (віджет), який реалізує поле в формі - SelectMultiple) class ProductAdmin(admin.ModelAdmin): formfield_overrides = { models.ManyToManyField: {'widget': forms.SelectMultiple(attrs={'size':'11'})}, } Саме завдяки вбудованому методу formfield_overrides можна модифікувати поля певного типу в адмінці. Звичайно тут криється недолік, а що як нам треба модифікувати лише одне поле. Для реалізації подібної задумки в Джанго потужний функціонал по перевизначенню властивостей поля

Удосконалення Джанго - адмінки: Кольоровий вивід полів об’єктів

Таке завдання: В базі даних знаходяться записи моделі Product. Організувати виведення в адміністративному інтерфейсі поля name кольором #сссссс, якщо поле is_active = False. Варіант рішення: Для зміни html формату виведення поля в Джанго моделі можливо задати метод довільної назви, який і буде відобрадати поле по-новому: class Product(models.Model): name = models.CharField() is_active = models.BooleanField() ...... def colored_name(self): color = "424242" if not self.is_active: color = "cccccc" return " %s " % ( color, self.name) colored_name.allow_tags = True colored_name.admin_order_field = "name" Як бачимо Джанго дозволяє використовувати метод (яка як усе в питоні є об’єктом), як відобрадення поля в адмінці. Пам’ятайте, про те щоб занести поле в list_display, інакше результат буде марний.

Робота з файлами Exсel в Python

Часом постає нагальна потреба опрацьовувати excel-документи в проекті. Скажімо, для прикладу, маємо інтернет магазин, що приймає таблиці, парсить їх, заганяє в базу. Відповідно нові товари стають доступні в базі. Для реалізації такої можливості в Python доступні такі модулі, як xlrd i xlwt (читання і запису відповідно) Отже, якщо треба прочитати документ екселя: 1. Імпортуємо читач: >>>import xlrd 2. Відкриваємо документ(файл) на читання: >>>document = xlrd.open_workbook("some_fie.xls") *слід бути обережним з форматами старше 2003 року, на момент написання статті вони не підтримувалися. 3. Вибираємо лист документу з яким будемо працювати: 3.1. Вибірка листа за індексом: >>>sh = document.sheet_by_index(0) #Вибираємо перший лист документу Excel 3.2. Вибірка листа за назвою: >>>sh = wb.sheet_by_name(u"Some_name") #Вибираємо Some_name лист документу Excel 4. Обробка рядків: >>> for rown in range(5,sh.nrows):...

Пошук атрибутів об’єкта

Сьогодні знайшов цікавий варіант пошуку атрибутів: filter(lambda aname: not aname.startswith('_'), dir(Myclass)) Функція filter конструює список для тих елементів об’єкту (що є ітерабельним), яким функція вертає True Отже функція фільтрування верне нам список атрибутів об’єкту Myclass, які не починаються з підкреслення(_) Також, головним чином, раджу використовувати методи hasattr(obj, name) , gettattr(obj,name) , setattr(obj,name,val)

Як перезавантажити сервер Django

Деколи по необережності для зупинки сервера Django натискаю Cntl-Z. Після такого завершення, при повторному запуску сервераз’являється повідомлення: Error: That port is already in use. Як вирішити проблему? Пропоную простою командою: sudo netstat -np | grep 8000 Зміст команди вивід інформації по 8000-му порту (порт по замовчуванню, на якому працює сервер Django) Далі ми беремо PID-процесу(proc_num) який займає порт, і вбиваємо його: sudo kill proc_num

Дещо про файли в Джанго

Трапився випадок коли прийшлося зберігати зображення в 2 етапи: Користувач має форму, яка складається з двох полів, одне з них поле для зображення. Аплоад зображення відбувається завдяки Аяксу, тобто користувач може відмовитися від подальшого коміту форми, трапитися розриви з’єднання і т.п. Тому вирішено картинки зберігати в тимчасовій папці, та при збереженні форми переносити зображення в іншу папку на постійне збереження. Як організувати перезбереження зображення? Для цього в Джанго є клас File або ImageFile (модуль django.core.files) some_obj.image = File(open(file_path))

Магія перетворення словника в список Python

Сьогодні знайшов ефективний спосіб перетворення словника в список кортежів Python. Для цього як найкраще підходить метод iteritems() . Цей метод вертає ітератор,який в свою чергу вертає пари ключ-значення: >>>dic ={'boys':16,'girls':18} >>>[(k,v) for (k,v) in dic.iteritems()] [('boys',16),('girls',18)] Крім того, можна отримати окремо ключі ( iterkeys() ), та значення ( itervavues() )

Баг сортування в Джанго

Підчас організації сортування вибірки з бази даних зіткнувся з такою проблемою: метод Джанго values_list() не вміє працювати з екстра полями в таблиці. Справа була так: a.) Є функція виду, яка робить наступну вибірку: entities = SomeModel.objects.select_related("another_model",).extra(SELECT={some_field: "SELECT * FROM ...."}) b.) Тепер після вибірки ми відсортуємо об’єкт запиту по полю отриманому через екстра: entities = entities.extra(order_by=['some_field']) c.) Далі припустимо, що нам треба получити суму по певному полю у вибірці. Для цього як найкраще підходить метод values_list(). Метод отримує як аргумент потрібні програмісту поля і виводить їх значення як список, тому: total = sum(values_list('field_1', flat=True )) Та ось тут і криється проблема, метод не вміє працювати з сортовоними по зовнішньому полю, об’єктами вибірки. Рішення: Проводити розрахунки суми до подібного сортування, тоді проблема не з’являється.
Сьогодні зареєструвався і створив свій перший запис у блозі. print "Hello, World!"