среда, 29 мая 2013 г.

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

Если в PHP, чтобы узнать значение переменной в том или ином месте кода, мы применяем echo, var_dump( ), print_r( ), то в фреймворке Django в коде моделей (models.py) или представлений (views.py) мы можем два метода: print и assert False, myvar

суббота, 25 мая 2013 г.

Показать название ManyToMany полей в админке Django

Есть у нас модель Collection. Коллекция может быть задействована в нескольких номинациях, поэтому связь здесь ManyToMany.

В админке эта модель будет отображаться так:


 Чтобы колонка появилась, нужно проделать пару шагов...

Как получить из списка первый элемент в шаблоне Django

Имеется модель Коллекция. У коллекции может быть несколько фотографий. Возникла необходимость в шаблоне, в котором уже получен список фотографий коллекции выводить только первую фотографию. Как это сделать?

1. В шаблоне Django можно проделать манипуляцию с тэгом with и фильтром first:

{% with attachments_list|first as attachment %}

    

{{ attachment.filename }}

{% endwith %}

2. Непосредственно обратиться к элементу списка по индексу. Это позволяет отобразить элемент с любым индексом:

{% with attachments_list.0 as attachment %}

    

{{ attachment.filename }}

{% endwith %}

пятница, 24 мая 2013 г.

inclusion_tag или Как отображать повторяющиеся блоки в шаблоне Django

Очень часто возникает необходимость отобразить в шаблоне Django повторяющиеся элементы. В нашем примере это будут призеры конкурса:


Как грамотно написать код для вывода повторяющихся элементов?

четверг, 23 мая 2013 г.

Как настроить MEDIA_ROOT и MEDIA_URL в Django

Параметры MEDIA_ROOT и MEDIA_URL показывают, куда будут складываться файлы, загружаемые пользователями вашего Django-сайта.
Но как их правильно настроить?

понедельник, 20 мая 2013 г.

Отображение ForeignKey в админке Django

Есть у нас модель Конкурс:
class Contest(models.Model):
    """
    Конкурс, проводимый ежегодно
    """
    title = models.CharField(max_length=200, verbose_name='Название конкурса')
    year = models.SlugField(unique=True, max_length=4, verbose_name='Год конкурса')
    description = models.TextField(verbose_name='Описание конкурса')

    def __unicode__(self):
        return unicode(self.year + " " + self.title)
        
    class Meta:
        verbose_name = 'Конкурс'
        verbose_name_plural = 'Конкурсы'
Допустим мы хотим использовать ее в модели Призер:
class Prizer(models.Model):

    contest = models.ForeignKey(Contest, verbose_name=u'Конкурс')
    # другие поля...
        
    class Meta:
        verbose_name = 'Призер'
        verbose_name_plural = 'Призеры'
Вот как в админке Django отобразится модель Prizer и поле contest:

Для того, чтобы эти записи в выпадающем списке были отсортированы по-порядку, в классе Contest добавим:
class Contest(models.Model):
    # все то же, что написано выше
        
    class Meta:
        # ...
        #вот эта магическая строчка для сортировки:
        ordering = ('year',)
После этого записи будут отсортированы в используемом поле ForeignKey по-порядку:

четверг, 16 мая 2013 г.

Декораторы в python

Взгляните на этот чудо-код с декоратором @amazed:
def amazed(func):
    def wrap():
        return func() + 'aaa!'

    return wrap

@amazed  
def hey():
    return 'hey'

print hey() # 'heyaaa!'
Эта запись позволяет заменить следующий код:
def amazed(func):
    # определяем функцию-обертку
    def wrap():
        # выполняем переданную функцию - func(). 
        # К результату подсоединяем строку 'aaa!'
        return func() + 'aaa!'
    # возвращаем объект функции wrap
    return wrap
    
def hey():
    return 'hey'
  
hey = amazed(hey)   

print hey()
Таким образом, декоратор @amazed позволил нам, не тронув кода функции hey(), изменить ее поведение и сделать так, чтобы к слову 'hey' добавлялась строка 'aaa!'

Зачем в python обрабатывать ошибки?

Все познается из практики. Будет ли показано 'hello':
def shout(word=u'yes'):
    return word.capitalize()+'!'
    
scream = shout

del shout
print shout()
print 'Hello'
Переменную shout мы удалили, поэтому будет ошибка. Выполнение скрипта остановится, слово 'hello' показано не будет.
Но в python есть блок try/catch/finally, который позволяет обработать ошибку и дать скрипту шанс выполняться дальше.
def shout(word=u'yes'):
    return word.capitalize()+'!'
    
scream = shout

del shout

# Мы заранее предвидим, что функцию
# shout() мог удалить какой-то касатик
try:
    print shout()
except NameError, e:
    print e
print 'Hello'
В этом случае будет выведено:
name 'shout' is not defined
Hello

воскресенье, 5 мая 2013 г.

Django и fixtures

Раньше я для разработки использовал базу данных sqlite3. И это было ошибкой, т.к.
1. в продакшене я применял другую базу данных - MySQL
2. возможности sqlite3 слишком ограничены, что не позволяло мне использовать south в своих разработках.

Теперь я по совету западных разработчиков использую в своих проектах PostgreSQL.
Кстати, я был привязан к sqlite потому, что это удобно сохранить данные разрабатываемого сайта в одном файлике mysite.sqlite3, потом скинуть папку с проектом на другой компьютер, запустить там manage.py runserver и... вуаля - сайт работает!
Но оказывается в django есть возможность сделать так, чтобы данные автоматически вставлялись в базу данных при syncdb проекта.
Для этого существуют fixtures - представления данных ваших приложений в форматах .json/.xml/.yaml

Дамп базы данных в файл фикстур

python manage.py dumpdata --format=json myapp > myapp/fixtures/initial_data.json

По умолчанию фикстуры нужно хранить в папке fixtures, которую нужно создать внутри каждого приложения.
Если фикстуры сохраняются в файл с названием initial_data, то при каждом syncdb фикстуры будут загружаться в базу данных вашего проекта.

Загрузка фикстуры из файла

python manage.py loaddata myapp/fixtures/myfix.json

Здесь мы вручную загружаем в базу данных приложения myapp данные, сохраненные в файле myfix.json

суббота, 4 мая 2013 г.

PostgreSQL против MySQL

В своих проектах я всегда использовал MySQL и не задумывался, что может быть что-то лучше. Недавно услышал, что есть другая база данных и что она якобы гораздо удобнее. Многие разработчики Django используют в своей работе именно PostgreSQL. Данное видео поможет вам понять - хотите вы использовать MySQL или нет.



После просмотра этого видео я решил перейти на использование в проекте своего сайта http://yesnik.ru базы данных PostgreSQL.