Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Планы
2010-03-06 22:15:07

Окончательно понял, что ресурсов по дальнейшему переводу в ближайшее время у меня так и не появится. Что ж, будем менять формат сайта. Он по-прежнему останется ориентированным на новичков. Но и заматеревших джангистов тоже приятно видеть на нашем канале.

Исходники перевода будут выложены в формате DocBook XML в Git. Патчи с исправлениями и, может быть, переводами оставшихся глав будут приниматься, проверяться и выкладываться на сайт. Думаю, это поможет всем желающим поучаствовать в данном проекте.


Выложена шестая глава
2009-11-12 19:52:46

Несмотря на страшную загруженность была завершена работа по проверке перевода шестой главы, который был предоставлен Дмитрием aka Alerion. Огромное ему спасибо за проделанную работу.


Седьмая глава переведена
2009-09-03 12:05:29

Данная глава была полностью переработана авторами, поэтому она потребовала значительно больше времени на её перевод. Простая коррекция предыдущей версии главы здесь не помогала. Читайте и присылайте уведомления о замеченных ошибках.

P.S. Скоро обещают прислать перевод шестой главы...


Пятая глава переведена
2009-08-26 21:45:40

На фоне решения сложной (для меня) проблемы с дизайном в стороннего проекта, сегодня за день перевёл пятую главу книги. Всё выложено на сайт. Я пропустил совсем немного английского текста. Места, к которым я планирую вернуться, отмечены словом FIXME. Переводы такого текста можно присылать через жалобную систему.


Книга о Django
2009-08-22 22:10:20

Камрад Plesser любезно предоставил книгу Django. Разработка веб-приложений на Python. Я выделил время на её изучение. Первое время, я даже начал подумывать о завершении работы над переводом второй версии DjangoBook. Но дочитав, понял, что надо продолжать.

Моё резюме книги: Очень хороший материал для человека решившего перейти на Django/Python с других платформ. Материал подаётся наглядно и достаточно подробно. Разбирается работа нескольких приложений: блог, фотогалерея и так далее.

Но!

Книгу писали до выхода версии Django 1.0. Там есть моменты, которые не соответствуют действительности (я имею в виду версию из SVN). И вообще, после года работы с Django понимаешь, что на самом деле проекты надо делать не так как пишут в книжках. Так что, перевод DjangoBook будет продолжен. А там можно будет подумать о книге «Django: Используем по-взрослому.»



Расширение модели пользователя через наследование

По материалам http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

Дополнительные поля для модели пользователя

Большинство Django проектов нуждаются в хранении дополнительной информации о каждом пользователе.

Старый способ: Профайл пользователя

Раньше создавалась модель для профайла пользователя, которая ассоциировалась как один-к-одному с моделью пользователя.

Модель:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, related_name='profile')
    timezone = models.CharField(max_length=50, default='Europe/London')

Конфигурация:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'

Использование:

profile = request.user.get_profile()
print profile.timezone

Данный подход отлично работал, но требовал дополнительного обращения к базе данных для любого запроса, использующего профайл пользователя (он, конечно, кэшировался в процессе выполнения запроса, таким образом каждое обращение к get_profile() не приводило к выполнению запроса). Дополнительно к этому, информация о пользователе располагалась в двух отдельных моделях, что требовало её согласованного обновления в них.

Новый способ: Наследование моделей

Частью огромной работы, проделанной в queryset-refactor товарищем Malcolm и остальными, явилось поддержка Django наследования моделей.

Начиная с ревизии 7477 (26 апреля 2008) ваши классы моделей могут наследоваться от любой существующей модели. Дополнительные поля сохраняются в отдельной таблице, которая подключается к таблице основной модели. Когда вы запрашиваете данные из своей модели, запрос использует JOIN для получения полей из неё и из базовой модели.

Наследование от User

Вместо того, чтобы создать класс для профайла пользователя, почему бы не унаследовать класс от стандартного User и добавить несколько полей?

from django.contrib.auth.models import User, UserManager

class CustomUser(User):
    """User with app settings."""
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()

После этого, каждый экземпляр CustomerUser будет обладать стандартными для User полями и методами, одновременно с наличием наших дополнительных полей и методов. Неплохо, да?

Мы добавим UserManager в качестве менеджера, получая таким образом доступ к стандартным методам. Например, для создания пользователя можно просто сделать так:

user = CustomUser.objects.create(...)

Если мы просто создадим пользователя через класс User, то мы не получим создание записи в таблице CustomUser. Создание пользователя необходимо производить через производный класс.

Вы можете работать с классом User, просто в этом случае у вас не будет доступа к новым полям и методам, которые предоставляет класс CustomUser.

Получение класса CustomUser по умолчанию

Но есть одна проблема. При обращении к request.user вы получаете доступ к экземпляру класса User, а не CustomUser, таким образом не получая доступа к дополнительным полям.

Всё, что нам требуется — Django должна незаметно получать экземпляр CustomUser. И этого можно добиться довольно легко.

Пользователи получаются от модуля аутентификации

Стандартный модуль (backend) аутентификации получает модель User из базы данных, проверяя пароль на корректность, когда возращает экземпляр User. Вы можете написать свой собственный модуль аутентификации, например, для проверки пароля и логина относительно другого источника данных, или для использования адреса электронной почты вместо логина.

В нашем случае, мы можем использовать модуль аутентификации для возвращения экземпляра CustomUser вместо User.

Файл auth_backends.py:

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model

class CustomUserModelBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = self.user_class.objects.get(username=username)
            if user.check_password(password):
                return user
        except self.user_class.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return self.user_class.objects.get(pk=user_id)
        except self.user_class.DoesNotExist:
            return None

    @property
    def user_class(self):
        if not hasattr(self, '_user_class'):
            self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
            if not self._user_class:
                raise ImproperlyConfigured('Could not get custom user model')
        return self._user_class

Файл settings.py:

AUTHENTICATION_BACKENDS = (
    'myproject.auth_backends.CustomUserModelBackend',
    'django.contrib.auth.backends.ModelBackend',
)
...

CUSTOM_USER_MODEL = 'accounts.CustomUser'

Вот и всё. Теперь, когда вы обратитесь к request.user, вы получите экземпляр класса CustomUser со всеми вашими дополнительными полями и методами.

Интерфейс администратора

А вот так подменяем пользователя в админке:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

from my_project.authuser.models import CustomUser

class CustomUserAdmin(UserAdmin):
    list_display = ('username', 'last_name', 'first_name',
                    'is_staff', 'is_active')

admin.site.unregister(User)
admin.site.register(CustomUser, CustomUserAdmin)

Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID