Mein views.pyist zu groß geworden und es ist schwer, die richtige Ansicht zu finden.
Wie teile ich es in mehrere Dateien auf und importiere es dann? Handelt es sich um einen Geschwindigkeitsverlust?
Kann ich das auch mit machen models.py?
Mein views.pyist zu groß geworden und es ist schwer, die richtige Ansicht zu finden.
Wie teile ich es in mehrere Dateien auf und importiere es dann? Handelt es sich um einen Geschwindigkeitsverlust?
Kann ich das auch mit machen models.py?
Antworten:
In Django ist alles ein Python-Modul (* .py). Sie können einen Ansichtsordner mit einer __init__.pyInnenseite erstellen und Ihre Ansichten weiterhin importieren, da hierdurch auch ein Python-Modul implementiert wird. Aber ein Beispiel wäre besser.
Ihr Original views.pykönnte folgendermaßen aussehen:
def view1(arg):
pass
def view2(arg):
pass
Mit der folgenden Ordner- / Dateistruktur funktioniert es genauso:
views/
__init__.py
viewsa.py
viewsb.py
viewsa.py ::
def view1(arg):
pass
viewsb.py ::
def view2(arg):
pass
__init__.py ::
from viewsa import view1
from viewsb import view2
Die schnelle Erklärung wäre: Wenn Sie schreiben from views import view1, sucht Python nach view1 in
views.py, was im ersten (ursprünglichen) Fall passiert
views/__init__.py, was im zweiten Fall passiert. Hier kann __init__.pydie view1-Methode bereitgestellt werden, da sie importiert wird.
Mit dieser Art von Lösung müssen Sie möglicherweise keine Argumente ändern importoder ändernurlpatternurls.py
Wenn Sie viele Methoden in jedem neuen View - Datei haben, ist es möglicherweise sinnvoll , die Importe in machen views/__init__.pyGebrauch *, wie folgt aus :
from viewsa import *
from viewsb import *
Ich weiß eigentlich nichts über Geschwindigkeitsprobleme (aber ich bezweifle, dass es welche gibt).
Für Models könnte es etwas schwierig sein.
__init__.py: from myapp.views.viewsa import *. Beachten Sie, dass Sie keine views.py mehr haben können (oder zumindest nicht gelesen wird @ShiftNTab: Fehler für nicht Finden Sie Ihre Ansichten in views.py). Hoffe, es hilft!
views.car.pyvsviews.cars.py
Ich musste das schon einmal machen (aus Gründen der Klarheit)
Die Art und Weise, wie ich dies tat, bestand darin, ein viewsVerzeichnis zu erstellen und dann eine Datei mit dem Namen zu erstellen__init__.py
Wenn Sie jetzt Ihren Anruf tätigen urls.py, müssen Sie lediglich einen weiteren Teil hinzufügen
Zum Beispiel haben Sie zuvor angerufen: -
url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year_by_user')
Sie können jetzt etwas in der Art von aufrufen
url(r'^calendar/(?P<year>\d\d\d\d)/$', 'myproject.calendar.views.year.index')
url(r'^calendar/(?P<year>\d\d\d\d)/(?P<user>[a-z]+)/$', 'myproject.calendar.views.year.user')
Dies setzt natürlich voraus, dass Sie views/year.pydie Funktionen enthalten haben indexund user;)
Grundsätzlich können Sie Ihren Code beliebig eingeben. Stellen Sie einfach sicher, dass Sie die Importanweisungen entsprechend ändern, z. B. für die Ansichten in der urls.py.
Wenn Sie Ihren tatsächlichen Code nicht kennen, ist es schwierig, etwas Sinnvolles vorzuschlagen. Vielleicht können Sie irgendeine Art von Dateinamenpräfix verwenden, zB views_helper.py, views_fancy.py, views_that_are_not_so_often_used.pyoder so ...
Eine andere Möglichkeit wäre, ein viewsVerzeichnis mit einem zu erstellen __init__.py, in das Sie alle Unteransichten importieren . Wenn Sie eine große Anzahl von Dateien benötigen, können Sie mehr verschachtelte Unteransichten erstellen, wenn Ihre Ansichten wachsen ...
Nur zum Teilen hatte ich ein paar Probleme mit Vincent Demeesters Antwort. Alles ist in Ordnung, außer in der init .py-Datei muss ich folgendermaßen schreiben:
__init__.py :
from .viewsa import *
from .viewsb import *
Auf diese Weise muss ich meine importMethode in urls.py immer noch nicht ändern. Ich bin auf Python 3.6.1 und Django 1.11.4 .
Einfache Antwort: Ja.
Am besten erstellen Sie ein Verzeichnis mit dem Namen views und führen dann in Ihrer urls.py Folgendes aus:
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
Ich habe fast alle Ansichten in meinen Apps in einen Ansichtsordner aufgeteilt ( natürlich mit einer init .py). Ich importiere jedoch nicht alle Unteransichten in die init .py, wie einige der Antworten vorgeschlagen haben. Es scheint gut zu funktionieren.
Da Django nur erwartet, dass eine Ansicht ein aufrufbares Objekt ist, können Sie sie in Ihren PYTHONPATH einfügen, wo immer Sie möchten. So können Sie beispielsweise einfach ein neues Paket myapp.views erstellen und dort Ansichten in mehrere Module einfügen. Sie müssen natürlich Ihre urls.py und andere Module aktualisieren, die auf diese View-Callables verweisen.
Ich habe damit gespielt, dies in meine Init .py zu schreiben:
import os
currPath = os.path.realpath(os.path.dirname(__file__))
dirFiles = []
for root, dirs, files in os.walk(currPath):
for name in files:
if name.endswith('.py') and not name.startswith('_'):
dirFiles.append(name.strip('.py'))
for f in dirFiles:
exec("from %s import %s" % (f,f))
Ich bin noch neu in Python, also schaue ich mir immer noch an, welche Auswirkungen es auf Geschwindigkeit / Sicherheit / Benutzerfreundlichkeit hat.
Die Antwort von Vincent Demeester ist hervorragend! aber für mich wirkte die Antwort des Süchtigen wie ein Zauber. Ich hatte Schwierigkeiten bei der Migration der Datenbank. Der Fehler zeigt die Zeile an, in die das erste Modell importiert wird, und besagt, dass mein App-Modul nicht erkannt werden konnte. Viel gesucht, aber keine Lösung gefunden, aber später habe ich das Modell folgendermaßen importiert:
from ..models import ModelName
Es funktionierte!!