Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 21, 2009 22:25:04

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

Вообщем использую дефолтное джанговское приложение contrib.Auth нужно заменить менеджер для модели User на свой, а точнее в этой модели User есть свой класс UserManager который наследуется от базового Manager
Так вот нужно подменить так чтобы класс UserManager наследовался не от Manager а от моего класса CustomManager.
Причем сделать это динамически (тк нету доступа к исходнику и не хочется его менять).

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

Есть мысль в __init__.py просто сделать замену объекта User.objects:

from django.contrib.auth.models import User
User.objects = ...
Но тут встает проблема как заменить классу UserManager его родительский класс на мой CustomManager и затем создать объект.

Подскажите как лучше сделать такое?



Отредактировано (Сен. 21, 2009 22:30:13)

Офлайн

#2 Сен. 22, 2009 01:23:19

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

думал написать, но проще было нагуглить)
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

всё очевидно

Офлайн

#3 Сен. 22, 2009 02:38:50

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

Ну вообще мне не нужно было ничего расширять) а именно подменить родительский класс менеджера User) ответ на это тут



Офлайн

#4 Сен. 22, 2009 14:00:52

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

А для чего такое надо было?

Офлайн

#5 Сен. 22, 2009 15:14:51

Evg
От:
Зарегистрирован: 2008-12-25
Сообщения: 346
Репутация: +  -1  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

Ferroman
А для чего такое надо было?
Расширял джангу чтобы могла в разные бд модели проецировать. Сначало заменял дефолтные менеджеры чтобы они выбирали нужное соединение. Но потом все свелось к тому что проще пропатчить конструктор базового класса BaseQuery.



Офлайн

#6 Сен. 23, 2009 14:49:09

vvp91
От:
Зарегистрирован: 2009-06-08
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

slav0nic
думал написать, но проще было нагуглить)
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
всё очевидно
К сожалению, не все очевидно.
Сделал, как описал Скотт в этой статье.
Наткнулся на то, что вход в админку перестал работать.
Ошибка <'NoneType' object has no attribute ‘DoesNotExist’> возникает в “списаном файле” account\backend.py:
class UserProfileModelBackend(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
...
Теперь не особо понимаю, куда смотреть.



Офлайн

#7 Сен. 23, 2009 22:27:33

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

contrib.Auth models.Manager заместить своим

18 камент смотри, вообще ничего не мешает написать по другому

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version