Mon views.py
est devenu trop grand et il est difficile de trouver la bonne vue.
Comment puis-je le diviser en plusieurs fichiers et l'importer ensuite ? Cela implique-t-il une perte de vitesse ?
Je peux faire la même chose avec models.py
?
Mon views.py
est devenu trop grand et il est difficile de trouver la bonne vue.
Comment puis-je le diviser en plusieurs fichiers et l'importer ensuite ? Cela implique-t-il une perte de vitesse ?
Je peux faire la même chose avec models.py
?
Dans Django, tout est un module Python (*.py). Vous pouvez créer un dossier de vue avec un __init__.py
à l'intérieur et vous serez toujours en mesure d'importer vos vues, parce que cela implémente également un module Python. Mais un exemple serait préférable.
Votre original views.py
pourrait ressembler à ceci :
def view1(arg):
pass
def view2(arg):
pass
Avec la structure de dossiers/fichiers suivante, le fonctionnement sera le même :
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
En rapide L'explication serait la suivante : lorsque vous écrivez from views import view1
Python cherchera la vue 1 dans
views.py
ce qui est le cas dans le premier cas (original).
views/__init__.py
ce qui est le cas dans le deuxième cas. Ici, __init__.py
est capable de fournir la méthode view1 car elle l'importe.
Avec ce type de solution, vous n'aurez peut-être pas besoin de changer import
o urlpattern
dans les arguments de urls.py
Si vous avez beaucoup de méthodes dans chaque nouveau fichier de vue, vous pourriez trouver utile de faire les importations dans views/__init__.py
utiliser *
comme ceci :
from viewsa import *
from viewsb import *
En fait, je ne connais pas les problèmes de vitesse (mais je doute qu'il y en ait).
Pour les modèles, cela peut être un peu difficile.
Pourriez-vous ajouter un modèle d'url qui correspond à la vue 1 ou à la vue 2 dans votre exemple ? Parce que j'ai des problèmes avec cela....
J'ai essayé de faire cela, mais lorsque je vais importer mes modèles (from app.models import MyModel ou from models import MyModel) Python se plaint que le modèle n'existe pas.
J'ai déjà eu à le faire (pour des raisons de clarté).
Pour ce faire, j'ai créé un views
puis, dans ce répertoire, créez un fichier appelé __init__.py
Maintenant, quand vous appelez dans votre urls.py
vous devez simplement ajouter une autre partie
Par exemple, auparavant, vous avez pu appeler :-
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')
Vous pouvez maintenant appeler quelque chose du genre
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')
Ceci est, bien sûr, en supposant que vous aviez views/year.py
contenant les fonctions index
et user
;)
En fait, vous pouvez placer votre code où vous le souhaitez. Assurez-vous simplement que vous modifiez les déclarations d'importation en conséquence, par exemple pour les vues dans le fichier urls.py
.
Sans connaître votre code actuel, il est difficile de suggérer quelque chose de significatif. Peut-être pouvez-vous utiliser une sorte de préfixe pour le nom de fichier, par ex. views_helper.py
, views_fancy.py
, views_that_are_not_so_often_used.py
ou alors ...
Une autre option serait de créer un views
avec un __init__.py
où vous importez tous les sous-vues . Si vous avez besoin d'un grand nombre de fichiers, vous pouvez créer davantage de sous-vues imbriquées au fur et à mesure que vos vues augmentent ...
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.
5 votes
J'ai divisé mon gros fichier views.py (7k lignes) en plusieurs fichiers séparés et l'augmentation de la vitesse a été significative.