2017-04-04 4 views
0

Ich verwende Django 1.10 für mein Projekt. Unten ist die Projektstruktur.Importieren von Klassen aus einer anderen App in Django

project 
|-accounts 
| |-forms 
| | |-__init__.py 
| | |-user_forms.py 
|-otherapp 
| |-views.py 

Ich habe UserForm Klasse in user_forms.py Datei definieren und in __init__.py Datei, die ich importiert user_forms als from .user_forms import *
Ich versuche UserForm in otherapp zu verwenden.
Ich war nur neugierig, warum

from accounts.form import UserForm 
form = UserForm(request.POST) 

Werke aber

import accounts.forms.UserForm 
form = UserForm(request.POST) 

oder

form = accounts.form.UserForm(request.POST) 

nicht funktioniert? Warum?

Ist nicht 3. Methode besser als die ersten beiden, wie folgt Zen von Python Explicit is better than implicit.

Was ist der beste Weg, um Klassen von einer App zu anderen zu importieren?

Antwort

1

Sie können import accounts.forms.UserForm nicht tun, weil UserForm eine Klasse ist, kein Modul. Sie können jedoch tun:

import accounts.forms 
form = accounts.form.UserForm(request.POST) 

Persönlich bevorzuge ich Ihren ersten Ansatz. Solange UserForm nicht mit einem anderen UserForm von account.views kollidiert, wird es keine Probleme verursachen. Der Import zeigt Ihnen, woher er importiert wurde. Daher denke ich nicht, dass "Explizit ist besser als implizit" hier ein Problem darstellt.

from accounts.form import UserForm 
form = UserForm(request.POST) 
0

Wenn wir import etwas Python Suche nach dem Namen Modul nicht für class oder function. UserForm ist eine Klasse nach Ihnen, deshalb import accounts.forms.UserForm funktioniert nicht. Sie können es auch tun, von:

from accounts.forms import * 
form = UserForm(request.POST) 

Für mehr auf import Anweisung Sie wie https://docs.python.org/3/reference/import.html und https://docs.python.org/3/reference/simple_stmts.html#import

+1

Stern Importe gehen kann 'aus accounts.forms importieren *' abgeraten - es macht es schwieriger, zu sehen, wo Importe kommen von. – Alasdair

Verwandte Themen