2015-12-15 15 views
3

В Django 1.8, я был в состоянии сделать следующее с моими сигналами, и все было хорошо:Используйте сигналы в Django 1.9

__init__.py:

from .signals import * 

сигналы .py:

@receiver(pre_save, sender=Comment) 
def process_hashtags(sender, instance, **kwargs): 
    html = [] 
    for word in instance.hashtag_field.value_to_string(instance).split(): 
     if word.startswith('#'): 
      word = render_to_string('hashtags/_link.html', 
            {'hashtag': word.lower()[1:]}) 

     html.append(word) 
     instance.hashtag_enabled_text = ' '.join(html) 

В Django 1.9, я получаю эту ошибку: django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Я знаю, что это происходит от __init__.py, но знает ли кто-нибудь об этом? Я предполагаю, может быть, положить его в модели? Если да, может кто-нибудь, пожалуйста, покажите мне, как это сделать?

models.py:

class Comment(HashtagMixin, TimeStampedModel): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    text = models.TextField(max_length=240) 
    hashtag_enabled_text = models.TextField(blank=True) 
    hashtag_text_field = 'text' 

    objects = CommentManager() 

    class Meta: 
     app_label = 'comments' 

    def __unicode__(self): 
     return self.text 

Спасибо заранее!

ответ

4

От release notes:

All models need to be defined inside an installed application or declare an explicit app_label. Furthermore, it isn’t possible to import them before their application is loaded. In particular, it isn’t possible to import models inside the root package of an application.

Импортируя свои сигналы в __init__.py, вы косвенно импортировать модели в корневой пакет приложения. Один из вариантов, чтобы избежать этого является изменение sender в строку:

@receiver(pre_save, sender='<appname>.Comment') 
def process_hashtags(sender, instance, **kwargs): 
    ... 

Рекомендуемый способ подключения сигналов, которые используют @receiver декоратора в версии 1.9 является создание application configuration, и импортировать модуль сигналов в AppConfig.ready().