UAWEB 2008. Моя презентация к докладу + фото. 5

Posted by dobrych Fri, 28 Mar 2008 18:26:00 GMT

Спасибо всем, кто подошел ко мне познакомиться/пообщаться, было очень интересно. Все пропустившие ждите видео с докладами...

Пока что не готов ничего написать толкового про саму конференцию, сделаю это позже. Но впечатления однозначно позитивные! Материал моего выступления смотрите в pdf и в Flash.

Updated: сегодня обработал фото, выбрал получше которые и залил. Кому будут нужны версии с бОльшим разрешением — пишите в комментах имя файла, я вышлю.

Архив zip 12 Мб

UAWEB 2008 5

Posted by dobrych Wed, 26 Mar 2008 22:13:00 GMT

Я буду говорить про django в пятницу 28-ого на конференции UAWEB-2008. Хотелось бы завести новые знакомства. Мое фото справа в сайдбаре. Подходите — буду рад пообщаться!

Постараюсь писать с конференции по мере возможности. И выкладывать фото. После выходных попробую сделать отчет.

Update: Смотрите фото, залил несколько на фламбер — UAWEB 2008. Буду по мере обработки докладывать.

Подкаст о веб-разработке 36

Posted by dobrych Tue, 25 Mar 2008 22:29:00 GMT

Сегодня важное событие у меня. Я наконец-то смог выродить подкаст о веб-разработке, который планировал оч давно записать. Даже не только планировал, но и пробывал. Итак, это моя третья попытка — более-менее удачная. Не могу сказать что я на 100% доволен результатом, но как говориться «первый блин можно и простить» :-)

Для меня намного важнее узнать ваше мнение, уважаемые читатели! На сколько вам был бы полезен вообще подкаст о веб-разработке. И о каких темах вы бы хотели услышать выпуски в будующем. Любые ваши комментарии (желательно конструктивные) будут мотивировать меня для дальнейшей записи. А так как я не диктор и не работал никогда на радио, дается мне сие записывание нелегко... Так что хотелось бы знать интересно ли будет что-то подобное для вас. Жду фидбека, а пока качайте 10 минутное mp3 весом в 14Мб :-)

Отдельный фид для подкаста скоро будет.

podcast icon

Update: сделал еще копию подкаста с битрейтом 128 на 10Мб

Две модели в newforms 10

Posted by dobrych Mon, 17 Mar 2008 00:37:00 GMT

На днях нужно было за короткое время решить одну несложную и довольно типичную задачу на django — построение формы профайла пользователя. Я не стал искать в закладках ссылки на старые известные how-to от мэтров-джангистов :-), а попробовал посмотреть что же нового и интересного у нас имеется в последней версии django (trunk).

Итак, модель была приготовлена заранее, вопрос больше касался построения формы (через newforms) пользовательского профайла. Итак, модель.


class UserProfile(models.Model):
    user = models.ForeignKey(User, verbose_name=_('user'), unique=True, related_name="profile")
    country = models.ForeignKey(Country, verbose_name=_('country'), blank=True, null=True)
    city = models.CharField(verbose_name=_('city'), max_length=30, blank=True, null=True)
    post_zip = models.CharField(verbose_name=_('post zip'), max_length=10, blank=True)
    address = models.CharField(verbose_name=_('address'), max_length=250, blank=True)

Обратите внимание, что профайл ссылается на модель User с unique=True. Это в принципе самый простой и работающий вариант расширения модели пользователя в django. Можно смело использовать для объекта User метод profile.get(). Например:


from django.contrib.auth.models import User
u = User.objects.get(username='test')
profile = u.profile.get()

Теперь для моделей User и UserProfile необходимо построить единую форму. Для каждой отдельной модели сделать это не проблема. А вот сделать «два в одном» не так просто. Итак, по порядку:

  1. Новенькое — широко используемые функции form_for_model и form_for_instance оказывается уже не актуальны. Они работают, но есть более новый и интересный метод получения формы для модели — ModelForm.

  2. В отличии от форм полученных через form_for_model и form_for_instance, формы от ModelForm можно наследовать (а вот это очень интересно в нашем случае!!!).

Поэтому, как только эти два пункта появились в моей голове, я сразу же открыл Python-консоль и начал экспериментировать с кодом. Не уверен на 100%, что мое решение максимально красивое, но тем не менее оно вполне простое и аккуратное (особенно если учесть, что времени на «подумать» особо не было)...

Итак кусочек моего forms.py ниже.


from django.newforms.models import ModelForm
from django.contrib.auth.models import User
from django import newforms as forms

from profile.models import UserProfile

class ProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        fields=('country', 'city', 'post_zip', 'address')

class ProfileFormFull(ProfileForm):
    def __init__(self, *args, **kwargs):
        super(ProfileFormFull, self).__init__(*args, **kwargs)
        self.fields['first_name'] = User._meta.get_field('first_name').formfield()
        self.fields['last_name'] = User._meta.get_field('last_name').formfield()

    def save_user_data(self):
        if self.instance:
            user = self.instance.user
            user.first_name = self.cleaned_data['first_name']
            user.last_name = self.cleaned_data['last_name']
            return user.save()
        else:
            raise instance.DoesNotExist

Теперь мои комментарии к коду (что я делаю):

  • Создаю форму ProfileForm из моей модели UserProfile.
  • Наследую от ProfileForm новую форму ProfileFormFull, которую буду расширять для возможности редактирования двух моделей (User и UserProfile) в одной форме.
  • Суть расширения в добавлении двух полей из модели User (first_name и last_name) и метода save_user_data который эти поля сохраняет в модель User.
  • Остальные поля из модели UserProfile обрабатываются автоматически созданным методом save.
  • При сохранении формы нужно вызывать два метода — save и save_user_data. Я специально оставил эту возможность для моего случая. Но вы можете сделать сохранение save_user_data внутри save, расширив его.

Как выглядит код, который работает с этой формой:


@login_required
@render_to('profile/main.html')
def profile_save(request):
    if request.method == 'GET':
        return HttpResponseRedirect(reverse('profile.views.profile_page'))
    profile, created = UserProfile.objects.get_or_create(user=request.user)
    form = ProfileFormFull(data=request.POST, instance=profile)
    if form.is_valid():
        form.save()
        form.save_user_data()
        request.user.message_set.create(message="Your profile details saved.")
        return HttpResponseRedirect(reverse('profile.views.profile_page'))
    else:
        return {'profile': profile, 'profile_form': form, 'user': request.user}

На этом пожалуй откланиваюсь. Был бы очень рад любым конструктивным замечаниям и вопросам в комментариях. Хотелось бы унифицировать кусок кода с формой (forms.py) и может вынести в отдельный сниппет.

PS: обязательно почитайте документацию по ModelForm, интересно :-)

Пять инструментов 7

Posted by dobrych Tue, 04 Mar 2008 15:48:00 GMT

Долго не мог принять эстфаету от Ивана — 5 инструментов хе-хе. Загруз был последнее время, но буду исправляться. Написал свой скупой список из пяти наиболее используемых инструментов в работе. Кого что-то заинтересует более подробно — спросите в комментариях, с удовольствием расскажу.

  1. MacBookPro — это действительно инструмент, такой как рубанок, дрель или лопата :-) Отличное устройство, я использую его мощь на полную катушку. Не буду особо распыляться как все круто, т.к. пиара маков в сети куча и без меня...

  2. Из софта — TextMate. Это мега-удобный редактор. Программирую и пишу статьи в нем.

  3. Шелл (shell) или терминал или командная строка — это то, что позволяет мне работать с файлами и процессами на компе эффективно.

  4. Firebug — наше все для дебага javascript/ajax и css.

  5. Зеленый чай с лимоном (особенно в холодное время года). Горячее меня бодрит и заставляет мозги думать лучше, плюс кофеин и витамин C из лимона поднимают тонус.