98 votes

le bon endroit pour conserver mes fichiers signaux.py dans django

sur la base des documents que j'ai lu de django site, Il semble que signals.py dans le dossier app est un bon endroit pour commencer, mais le problème suis confronté est que lorsque je crée des signaux pour pre_save et j'essaie d'importer la classe de modèle, il est en conflit avec l'opération d'importation pour des tâches dans le modèle. voir mon code ci-dessous

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]

ce code ne fonctionnera pas parce que je suis à l'importation Comm_queue à l'intérieur de signaux et fais * importation de signaux à l'intérieur models.py. peut-on conseils comment je pourrais plus venir ce problème?

en ce qui concerne,

228voto

Eric Marcos Points 53

Si vous êtes à l'aide de Django<=1.6 je le recommande Kamagatos solution: il suffit d'importer vos signaux à la fin de vos modèles de module.

Pour les futures versions de Django (>=1.7), le recommandé façon est d'importer vos signaux du module dans votre application de configuration de prêt() fonction:

my_app/apps.py

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'my_app'

    def ready(self):
        import my_app.signals

my_app/__init__.py

default_app_config = 'my_app.apps.MyAppConfig'

69voto

Yuri Prezument Points 2745

Vous pouvez enregistrer les signaux en important signals.py dans l'application __init__.py fichier:

 # __init__.py
import signals
 

Cela permettra d'importer models.py de signals.py sans erreur d'importation circulaire.

Un problème avec cette approche est que cela gâche les résultats de couverture si vous utilisez couverture.py.

Discussion connexe

27voto

Kamagatos Points 384

Pour résoudre votre problème, il vous suffit d’importer signaux.py après la définition de votre modèle. C'est tout.

6voto

aisbaa Points 1202

Je mets également des signaux dans le fichier signaux.py et possède également cet extrait de code qui charge tous les signaux:

 # import this in url.py file !

import logging

from importlib import import_module

from django.conf import settings

logger = logging.getLogger(__name__)

signal_modules = {}

for app in settings.INSTALLED_APPS:
    signals_module = '%s.signals' % app
    try:
        logger.debug('loading "%s" ..' % signals_module)
        signal_modules[app] = import_module(signals_module)
    except ImportError as e:
        logger.warning(
            'failed to import "%s", reason: %s' % (signals_module, str(e)))
 

Ceci est pour le projet, je ne suis pas sûr si cela fonctionne au niveau de l'application.

4voto

Issac Kelly Points 3014

J'imagine que c'est ce que vous faites pour que vos signaux soient enregistrés, de sorte qu'ils soient trouvés quelque part. Je viens de mettre mes signaux directement dans un fichier models.py normalement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X