2017-04-12 1 views
0

J'ai un projet avec plusieurs applications. Alors, quand je veux un code d'une autre application que j'utiliserDjango importer le code à partir d'autres applications

from app.pyfile import * 

ou

from app.pyfile import specific_function 

Pour être plus précis: J'ai une application appelée « commonapp » où j'ai des choses communes que j'utilise dans toutes les autres applications. Dans cette application, j'ai un fichier common.py où j'ai quelques fonctions, y compris une fonction appelée my_response(request,template,context), qui est l'un provoque NameError. Maintenant, cette fonction particulière est toujours appelée à l'intérieur d'autres fonctions.

par exemple:

from commonapp.common import * 

def myInfo(request): 
    context = {} 
    data = '' 
    data = SomeModel.objects.all() 
    template = 'path/to/info.html' 
    context['data'] = data 
    a = my_response(request,template,context) 
    return a 

Cela soulève une NameError "my_response nom global n'est pas défini"

Je sais ce qu'est un NameError est, mais pourquoi ici? Je m'attendrais à un ImportError si quelque chose n'a pas pu être importé ou même que "le nom global a n'est pas défini".

Qu'est-ce qui me manque ici?

MISE À JOUR:

Voici une capture d'écran montrant où la my_response(request,template,context) est et la structure de fichier de l'application.

enter image description here

+1

Euh, quoi? Vous obtenez une erreur NameError car my_response n'est pas défini ici ou importé depuis common. Qu'est-ce que tu ne comprends pas à ce sujet? –

+0

Lorsque j'essaie de faire 'depuis commonapp.common import my_response', j'obtiens une ImportError. Je n'arrive pas à comprendre comment cela est possible lorsque toutes les autres choses que j'ai importées d'autres applications sont importées. –

+0

Mais ces deux erreurs montrent que 'commonapp.common' ne contient pas de fonction appelée' my_response'. Comment est-ce que ce n'est pas clair? Peut-être que vous devriez montrer ce fichier. –

Répondre

2

Lorsque vous faites

from commonapp.common import * 

tout ce qui peut être importé du paquet est importé dans l'espace de noms global actuel. Apparemment, my_response n'est pas importé (pour une raison quelconque). Ainsi, vous obtenez NameError, parce my_response est résolu au point de celui-ci est l'exécution, à savoir dans

# Python tries to lookup `my_response` in local and then global context 
# But, it can't find it, thus NameError exception occurs. 
a = my_response(request,template,context) 

Et ImportError s sont généralement soulevées par les routines d'importation et sont from package import non_existing_function par exemple ne se rencontre pas dans d'autres contextes.

+0

Ok, quand vous importez une fonction d'un autre fichier, n'est-ce pas supposé être dans le contexte global? Si j'importe my_response() dans le def myInfo() cela fonctionne très bien ... Donc, il ne peut pas être importé en global mais peut être importé en fonction locale? Je ne comprends pas. Je veux dire comment les modèles d'autres applications sont importés? –

+1

Il se peut que vous ayez un problème d'importation circulaire, c'est-à-dire que commonapp.common importe le fichier contenant myInfo() directement ou indirectement via des importations imbriquées.Notez également que le fait de commencer à importer, comme 'depuis l'importation de paquetages 'est considéré comme une mauvaise pratique et devrait être évité à moins que vous ne compreniez vraiment pourquoi exactement vous devez tout importer. –

+0

J'y ai pensé, mais je ne peux pas trouver la connexion. Le myInfo() est sur une autre application, dans un fichier personnalisé, non imbriqué dans ListView par exemple. C'est juste une fonction qui obtient des données drom un modèle spécifique. Le my_response() est supposé être ma fonction "passepartout" pour le rendu des templates. Cela a fonctionné avec Django 1.5. Ceci est arrivé quand j'ai migré vers 1.8. Et je ne fais pas l'importation * souvent. Je l'ai essayé ici parce que j'ai eu l'erreur. –