2013-04-25 4 views
0

Это написано in the doc, что:Джанго 1,5 пользовательской модели пользователя - сигналы ограничения

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

Я предполагаю, что это означает, что вы можете сделать следующее:

from django.contrib.auth import get_user_model 

User = get_user_model() 

@receiver(post_save, sender=User) 
def user_saved(sender=None, instance=None, **kwargs): 
    # something 

Не так ли? Мне просто интересно, хорошо ли я понимаю (я не понимаю, почему они говорят, что это «ограничение», но что угодно, просто хочу проверить).

ответ

3

Это должно сработать. Я думаю, что они имеют в виду использовать ту же функцию, что и отправитель

в док:

как отправителя или цели обработчика сигнала. Вместо этого вы должны зарегистрировать обработчик с результирующей модели User

6

Это потому, что объект не был «установлен», когда сигнал создается так get_user_model() не может найти объект что он должен подключить обработчик сигнала.

См. this bug для получения подробной информации о том, как оно было найдено и в чем проблема.

Ваш пример не сработает, потому что по этой причине не удастся вызвать вызов get_user_model(). Пока единственный способ сделать обработчик сигнала работы с пользовательским классом User, чтобы назвать его непосредственно, без использования get_user_model(), например

@receiver(post_save, sender=myapp.MyUserModel) # can't use get_user_model() here 
def user_saved(sender=None, instance=None, **kwargs): 
    # something 

Ваш стиль кодирования может также сделать некоторые работы: при запуске User = get_user_model(), что создает переменная, называемая User, ее значение установлено на результаты вызова функции get_user_model(). Соглашение Python (и большинство других языков) для обычных переменных начинается с буквы в нижнем регистре и для классов, начинающихся с буквы верхнего регистра.

Так что user = get_user_model(), а затем с использованием переменной user в дальнейшем было бы более разумным, если бы кто-нибудь читал ваш код и помог бы избежать путаницы в будущем.

+0

Не уверен, что вы означая о строчных букв, пользователь в этом случае является вызываемым, или класс, однако, вы называете это. Кроме того, ваша точка права ** при использовании get_user_model в тех же models.py, что AUTH_USER_MODEL **. Это хороший момент, но ваше сообщение непонятно – lajarre

0

Вы можете просто использовать настройку AUTH_USER_MODEL или любую модель в виде строки, например. 'users.MyCustomUser':

def user_post_save_handler(**kwargs): 
    # do something 
post_save.connect(user_post_save_handler, sender=settings.AUTH_USER_MODEL) 
Смежные вопросы