3

在 Django 1.8 中,我能够使用信号执行以下操作,并且一切都很好:

__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,但有人知道解决方法吗?我假设也许把它放在模型中?如果是这样,有人可以告诉我该怎么做吗?

模型.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

1 回答 1

4

发行说明

所有模型都需要在已安装的应用程序中定义或声明显式 app_label。此外,在加载应用程序之前无法导入它们。特别是,无法在应用程序的根包中导入模型。

通过在 中导入信号__init__.py,您将在应用程序的根包中间接导入模型。避免这种情况的一种选择是将 更改sender为字符串:

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

在 1.9中使用装饰器连接信号的推荐方法@receiver是创建应用程序配置,并在AppConfig.ready().

于 2015-12-15T23:10:37.383 回答