Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2009 13:25:44

avekir
От:
Зарегистрирован: 2009-01-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Extending the Django User mode

Привет,

Сразу хочу сказать, что извиняюсь за такой большой объем и прекрасно понимаю, что Вам лень читать чужой бред, но все же Спасибо если поможете разобраться

Необходимо добавить несколько полей для класса User
Нашел вот такую интересную ссылку http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Собственно я хочу понять как оно работает.
Предположим мне надо добавить поле MazaFaka, тогда я должен написать так

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

class CustomUser(User):

MazaFaka= models.CharField(max_length=50, default='Europe/London')

objects = UserManager()
После этого создается еще одна таблица CustomUser в которой помимо стандартных полей класса User есть еще одно поле MazaFaka.
В дальнейшем все манипуляции необходимо совершать через CustomUser.objects.ххх, где ххх ( __unicode__(self), get_absolute_url(self), is_anonymous(self), is_authenticated(self), get_full_name(self), set_password(self, raw_password), check_password(self, raw_password) ну и т.д.)

Чтобы добавить пользователя необходимо написать так: CustomUser.objects.create(username = ‘testuser’, first_name='Василий', last_name='Пупкин', MazaFaka='Мазафака')

Так ну остается последнее…. когда приходит request.user то моих дополнительных полей в этом риквесте не будет потому, что оно ссылается на класс User, а не на CustomUser
Для этого надо написать еще тонну кода:
Вырезка
the authentication backend in 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
config in settings.py

AUTHENTICATION_BACKENDS = (
'myproject.auth_backends.CustomUserModelBackend',
)
...

CUSTOM_USER_MODEL = 'accounts.CustomUser'
Ну и теперь получается вот что
def myfunc(request):
print request.user.mazafaka # выводит значение



Офлайн

#2 Янв. 29, 2009 15:26:14

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Extending the Django User mode

Что конкретно у вас вызывает затруднение?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version