Mi se views.py
ha vuelto demasiado grande y es difícil encontrar la vista correcta.
¿Cómo lo divido en varios archivos y luego lo importo? ¿Implica alguna pérdida de velocidad?
¿Puedo hacer lo mismo con models.py
?
Mi se views.py
ha vuelto demasiado grande y es difícil encontrar la vista correcta.
¿Cómo lo divido en varios archivos y luego lo importo? ¿Implica alguna pérdida de velocidad?
¿Puedo hacer lo mismo con models.py
?
Respuestas:
En Django todo es un módulo de Python (* .py). Puede crear una carpeta de vista con un __init__.py
interior y aún podrá importar sus vistas, porque esto también implementa un módulo Python. Pero un ejemplo sería mejor.
Su original views.py
podría verse así:
def view1(arg):
pass
def view2(arg):
pass
Con la siguiente estructura de carpetas / archivos funcionará igual:
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
La explicación rápida sería: cuando escriba from views import view1
Python buscará view1 en
views.py
, que es lo que sucede en el primer caso (original)
views/__init__.py
, que es lo que sucede en el segundo caso. Aquí, __init__.py
puede proporcionar el método view1 porque lo importa.
Con este tipo de solución, es posible que tenga ninguna necesidad de cambiar import
o de urlpattern
las alegaciones deurls.py
Si tiene muchos métodos en cada nuevo archivo de vista, puede resultarle útil hacer las importaciones en views/__init__.py
uso *
, de esta manera:
from viewsa import *
from viewsb import *
En realidad no sé sobre problemas de velocidad (pero dudo que haya alguno).
Para los modelos puede ser un poco difícil.
__init__.py
:. from myapp.views.viewsa import *
Tenga en cuenta que ya no puede tener views.py (o al menos no se leerá @ShiftNTab: Error por no . búsqueda de sus puntos de vista en views.py) espero que ayude!
views.car.py
vsviews.cars.py
He tenido que hacer esto antes (por razones de claridad)
La forma en que hice esto fue crear un views
directorio, luego, en eso, crear un archivo llamado__init__.py
Ahora, cuando está llamando a su urls.py
, simplemente necesita agregar otra parte
Por ejemplo, anteriormente, puede haber llamado: -
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')
Ahora puede llamar a algo en la línea de
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')
Esto es, por supuesto, suponiendo que tenía que views/year.py
contener las funciones index
y user
;)
Básicamente, puede poner su código, donde lo desee. Solo asegúrese de cambiar las declaraciones de importación en consecuencia, por ejemplo, para las vistas en el urls.py
.
Sin conocer su código real, es difícil sugerir algo significativo. Tal vez se puede utilizar algún tipo de prefijo del nombre, por ejemplo views_helper.py
, views_fancy.py
, views_that_are_not_so_often_used.py
o algo así ...
Otra opción sería crear un views
directorio con un __init__.py
, donde importe todas las subvistas . Si necesita una gran cantidad de archivos, puede crear más subvistas anidadas a medida que crecen sus vistas ...
Solo por compartir, tuve algunos problemas con la respuesta de Vincent Demeester. Todo está bien, excepto en el archivo init .py, tengo que escribir de esta manera:
__init__.py :
from .viewsa import *
from .viewsb import *
De esta manera, todavía no necesito cambiar mi import
método en urls.py. Estoy en Python 3.6.1 y Django 1.11.4 .
Respuesta simple: sí.
Lo mejor es hacer un directorio llamado vistas y luego en su urls.py hacer:
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
Dividí casi todas las vistas en mis aplicaciones en una carpeta de vistas (con un init .py, por supuesto). Sin embargo, no importo todas las subvistas en init .py como algunas de las respuestas han sugerido. Parece funcionar bien.
Dado que Django solo espera que una vista sea un objeto invocable, puede colocarlo donde desee en su PYTHONPATH. Entonces, por ejemplo, podría hacer un nuevo paquete myapp.views y colocar vistas en múltiples módulos allí. Naturalmente, tendrá que actualizar su urls.py y otros módulos que hacen referencia a estas vistas invocables.
He estado jugando con poner esto en mi init .py:
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))
Todavía soy nuevo en Python, así que todavía estoy viendo qué efecto tiene en la velocidad / seguridad / facilidad de uso.
¡La respuesta de Vincent Demeester es excelente! pero para mí la respuesta de los adictos funcionó de maravilla. Enfrenté dificultades en la migración de la base de datos. El error indica la línea donde se importa el primer modelo y dice que no se pudo reconocer el módulo de mi aplicación. Busqué mucho pero no pude encontrar una solución, pero luego importé el modelo así:
from ..models import ModelName
¡¡Funcionó!!