将我的signals.py 文件保存在Django 项目中的正确位置 [英] The right place to keep my signals.py file in a Django project

查看:21
本文介绍了将我的signals.py 文件保存在Django 项目中的正确位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据我正在阅读的 Django 文档,app 文件夹中的 signals.py 似乎是一个不错的起点,但我面临的问题是当我为pre_save 并且我尝试从模型中导入类,它与我的模型中的 import 冲突.

#models.py从 django.contrib.auth.models 导入用户从 django.db 导入模型从 django.utils.translation 导入 gettext 为 _从信号导入 *类 Comm_Queue(CommunicatorAbstract):队列状态 = (('P', _('待定')),('S', _('发送')),('E', _('错误')),('R', _('拒绝')),)status = models.CharField(max_length=10, db_index=True, default='P')is_html = models.BooleanField(默认=假)语言=models.CharField(max_length=6,选择=settings.LANGUAGES)sender_email = models.EmailField()收件人电子邮件 = models.EmailField()主题=models.CharField(max_length=100)内容 = 模型.TextField()

<小时>

#signals.py从 django.conf 导入设置从 django.db.models.signals 导入 pre_save从 django.dispatch 导入接收器从模型导入 Comm_Queue@receiver(pre_save, sender=Comm_Queue)def get_sender_email_from_settings(sender, **kwargs):obj=kwargs['实例']如果不是 obj.sender_email:obj.sender_email='%s' % settings.ADMINS[0][1]

此代码将无法运行,因为我在 signals.py 中导入了 Comm_Queue 并且我也在 models.py 中导入了信号.

谁能就我如何克服这个问题提出建议?

问候

解决方案

Original answer, for Django <1.7:

您可以通过在应用程序的 __init__.py 文件中导入 signals.py 来注册信号:

# __init__.py输入信号

这将允许从 signals.py 导入 models.py 而不会出现循环导入错误.

这种方法的一个问题是,如果您使用coverage.py,它会弄乱覆盖结果.

相关讨论

对于 Django >= 1.7:

自从引入 AppConfig 以来,推荐的信号导入方式是在其 init() 函数中.有关详细信息,请参阅埃里克·马科斯的回答.

Based on Django's documentation I was reading, it seems like signals.py in the app folder is a good place to start with, but the problem I'm facing is that when I create signals for pre_save and I try to import the class from model it conflicts with the import in my model.

# models.py

from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import gettext as _
from signals import *

class Comm_Queue(CommunicatorAbstract):
    queue_statuses = (
        ('P', _('Pending')),
        ('S', _('Sent')),
        ('E', _('Error')),
        ('R', _('Rejected')),
    )
    status          = models.CharField(max_length=10, db_index=True, default='P')
    is_html         = models.BooleanField(default=False)
    language        = models.CharField(max_length=6, choices=settings.LANGUAGES)
    sender_email    = models.EmailField()
    recipient_email = models.EmailField()
    subject         = models.CharField(max_length=100)
    content         = models.TextField()


# signals.py

from django.conf import settings
from django.db.models.signals import pre_save
from django.dispatch import receiver
from models import Comm_Queue

@receiver(pre_save, sender=Comm_Queue)
def get_sender_email_from_settings(sender, **kwargs):
    obj=kwargs['instance']
    if not obj.sender_email:
        obj.sender_email='%s' % settings.ADMINS[0][1]

This code will not run because I import Comm_Queue inside signals.py and I also import the signals inside models.py.

Can anyone advice on how I could over come this issue?

Regards

解决方案

Original answer, for Django < 1.7:

You can register the signals by importing signals.py in the app's __init__.py file:

# __init__.py
import signals

This will allow to import models.py from signals.py without circular import errors.

One problem with this approach is that it messes up the coverage results if you're using coverage.py.

Related discussion

Edit: For Django >= 1.7:

Since AppConfig was introduced, the recommended way of importing signals is in its init() function. See Eric Marcos' answer for more details.

这篇关于将我的signals.py 文件保存在Django 项目中的正确位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆