将我的signals.py文件保存在django中的正确位置 [英] the right place to keep my signals.py files in django

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

问题描述

根据我从django网站上阅读的文档,应用文件夹中的signals.py好像是开始的好地方,但是面临的问题是当我为pre_save创建信号时,我尝试导入模型中的类,它与模型中任务的导入操作冲突。请参阅我的代码



model.py

  from django.contrib .auth.models import来自django.db的用户
导入模型
from django.utils.translation import gettext as _
from signals import *
class Comm_Queue(CommunicatorAbstract):
queue_statuses =(
('P',_('Pending')),
('S',_('Sent')),
('E' ''''''''''''''''''''''''''''''' ')
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 djan go.conf导入设置
from django.db.models.signals import pre_save
from django.dispatch import receiver
from models import Comm_Queue


@接收方(pre_save,sender = Comm_Queue)
def get_sender_email_from_settings(sender,** kwargs):
obj = kwargs ['instance']
如果不是obj.sender_email:
obj。 sender_email ='%s'%settings.ADMINS [0] [1]

此代码不会运行因为我在内部输入Comm_queue信号,并且正在进行*导入到models.py中的信号中。可以任何一个建议我怎么能过来这个问题?



敬意,

解决方案>

原始答案,对于Django< 1.7:



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

 #__init__.py 
导入信号

这将允许从<$ c $中导入 models.py c> signals.py 没有循环导入错误。



这种方法的一个问题是,如果您使用coverage.py。



相关讨论



编辑:对于Django> = 1.7:



引入了AppConfig,导入信号的推荐方式是它的 init()函数。有关详细信息,请参阅 Eric Marcos的答案


based on the documentation i was reading from django site, It seems like signals.py in the app folder is a good place to start with, but the problem am facing is that when I create signals for pre_save and I try to import the class from model, it conflicts with the import operation for task in model. see my code below

model.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 am import Comm_queue inside signals and am doing * import to signals inside models.py. can any one advice 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 it's init() function. See Eric Marcos' answer for more details.

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

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