Линкотека №4. «Клиентура». 2

Posted by dobrych Fri, 02 Jan 2009 12:51:00 GMT

Сегодня подборка интересных ссылок по теме клиентских веб-технологий аля код для браузера.

  • Visual Event почетно занимает в этом списке первое место! Отличный JavaScript инструмент, выполненный в виде букмарклета. Позволяет просматривать привязку событий JavaScript к элементам страницы визуально. Поддерживает jQuery, YUI и MooTools. Отличный инструмент для дебага JavaScript. Посмотреть демо.

  • JS Bin — следующий инструмент для дебага JavaScript/HTML/CSS, позволяет интерактивно совместно нескольким разработчикам тестировать код. Поддерживает все мажорные JavaScript библиотеки (кроме ExtJS). Описать функционал трудно, попробуйте, в нем легко разобраться или посмотрите видео.

  • Twitterjs — небольшая JavaScript библиотека для интеграции твиттера в ваш сайт. Позволяет в несколько строчек подключить и настроить на свой влад ленту сообщений. На много удобнее чем стандартный способ, предлагаемый на страницах сервиса.

  • JazzRecord JavaScript ORM — новый проект, один из немногих решивших попробовать реализовать ORM на JavaScript. Проект вполне актуален, т.к. уже есть ряд технологий, где он может быть использован (Adobe AIR, Google Chrome и другие, используещие браузерные базы данных). Синтаксис ORM подобен ActiveRecord из Ruby on Rails.

Загрузка файлов в Django. FileField & upload_to. 3

Posted by dobrych Fri, 02 Jan 2009 10:56:00 GMT

На момент выхода версии 1.0 Django, одним из самых значительных изменений стал механизм загрузки (upload) и хранения (storage) файлов. Загрузка файлов без FileField в модели базы данных конечно очень редкий случай, поэтому начнем именно с одного из обязательных параметров FileField — upload_to.

Главная инновация — это гибкая возможность настройки этого самого upload_to. Раньше можно было только передавать строку с кодированными strftime параметрами. Тем самым можно было разбивать загруженные файлы по директориям, создаваемыми по дате, типа uploads/mp3/2008-12/uploaded.mp3. Сейчас параметром upload_to может быть и callable, т.е. к примеру функция, которая должна возвращать полный путь с именем файла, куда будет сохраняться загруженный файл. Функция должна принимать два параметра: instance и filename.

  • instance — это экземпляр объекта модели, которой и принадлежит поле с типом FileField.
  • filename — юникодное имя файла.

Эта функция будет запускаться перед сохранением в базу, поэтому если объект новый (вы не редактируете существующий объект, а создаете новый), то поле pk/id будет пустым и соотвественные Django сигналы еще не выполнены. Думаю, что с примером кода все будет наиболее хорошо понятно.

Итак функция-callback, которую мы будем использовать в upload_path:

def make_upload_path(instance, filename):
    """Generates upload path for FileField"""
    return u"uploads/%s/%s" % (instance.category.slug, filename)

Теперь пример модели с FileField:

class Upload(models.Model):
    user = models.ForeignKey(User)
    file = models.FileField(upload_to=make_upload_path)
    category = models.ForeignKey(Category)
    uploaded_date = models.DateTimeField(auto_now_add=True)

Все просто. Можно использовать множество параметров вашей модели для создания директорий и упорядочивания файлов в них. И самое главное upload_to — самый простой способ закачивания файлов с русскими (и другими юникодными) именами. Т.к. по-умолчанию Django заменяет их на символ подчеркивания, что приводит к появлению файлов типа __________.jpg. Если вы сделаете самую простую функцию с вовращением вида return u"uploads/mypath/%s" % (filename), то получите русские имена файлов после закачки.

Официальная документация Django по FileField.