176 votes

Diviser views.py en plusieurs fichiers

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 ?

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.

231voto

Vincent Demeester Points 1531

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

  1. views.py ce qui est le cas dans le premier cas (original).

  2. 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.

3 votes

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....

3 votes

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.

0 votes

C'est ok si nous supprimons views.py dans le répertoire Root ?

24voto

Mez Points 9744

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 ;)

11voto

miku Points 63392

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 ...

6voto

Peter Bengtsson Points 1180

Réponse simple : Oui.

Le mieux est de créer un répertoire appelé views et ensuite dans votre urls.py faire :

import views
...
url(r'^classroom$', views.school.klass, name="classroom"),

1voto

DrBloodmoney Points 1908

Je répartis presque toutes les vues de mes applications dans un dossier de vues (avec un init .py bien sûr). Cependant, je n'importe pas toutes les sous-vues dans le fichier init .py comme certaines des réponses l'ont suggéré. Cela semble fonctionner parfaitement.

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