Мой views.py
стал слишком большим и трудно найти правильный вид.
Как мне разбить его в нескольких файлах, а затем импортировать? Связано ли это с потерей скорости?
Могу ли я сделать то же самое с models.py
?
В Django все это Python-модуль (*.py). Вы можете создать папку вида с __init__.py
внутри, и вы все равно сможете импортировать свои представления, потому что это также реализует модуль Python. Но пример будет лучше.
Ваш оригинальный views.py
может выглядеть так:
def view1(arg):
pass
def view2(arg):
pass
Со следующей структурой папки/файла она будет работать одинаково:
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
Быстрое объяснение: когда вы пишете from views import view1
Python будет искать view1 в
views.py
, что и происходит в первом (оригинальном) случае
views/__init__.py
, что и происходит во втором случае. Здесь __init__.py
может предоставить метод view1, поскольку он импортирует его.
При таком решении вам не нужно менять аргументы import
или urlpattern
в urls.py
Если у вас есть много методов в каждом новом файле представления, вам может показаться полезным сделать импорт в views/__init__.py
использовать *
, например:
from viewsa import *
from viewsb import *
Я действительно не знаю о проблемах скорости (но я сомневаюсь, что они есть).
Для моделей это может быть немного сложно.
Я должен был сделать это раньше (ради ясности)
То, как я это делал, это создать каталог views
, а затем создать файл с именем __init__.py
Теперь, когда вы звоните в свой urls.py
, вам просто нужно добавить другую часть
Например, ранее вы могли вызвать: -
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')
Теперь вы можете вызывать что-то вдоль строк
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')
Это, конечно, предполагается, что у вас есть views/year.py
, содержащий функции index
и user
;)
В принципе, вы можете поместить свой код, если хотите. Просто убедитесь, что вы соответствующим образом меняете инструкции импорта. для представлений в urls.py
.
Не зная ваш фактический код, трудно предположить что-то значимое. Возможно, вы можете использовать какой-то префикс имени файла, например. views_helper.py
, views_fancy.py
, views_that_are_not_so_often_used.py
или так...
Другой вариант - создать каталог views
с __init__.py
, где вы импортируете все подзаголовки. Если у вас есть потребность в большом количестве файлов, вы можете создать больше вложенных представлений, поскольку ваши представления растут...
Простой ответ: Да.
Лучше всего создать каталог с именем views, а затем в urls.py do:
import views
...
url(r'^classroom$', views.school.klass, name="classroom"),
Просто для обмена, у меня было немного проблем с ответом Винсента Демейстера. Все в порядке, за исключением файла init.py, я должен написать следующим образом:
__ __ INIT ру:.
from .viewsa import *
from .viewsb import *
Таким образом, мне все равно не нужно менять метод import
в urls.py. Я на Python 3.6.1 и Django 1.11.4.
Я играл с помещением в мой 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))
Я все еще новичок в python, поэтому я все еще смотрю, какой эффект он оказывает на скорость/безопасность/простоту использования.
Я разделяю почти все представления в своих приложениях в папку представлений (с init.py, конечно). Тем не менее, я не импортирую все подпрограммы в init.py, как некоторые из предложенных ответов. Кажется, что все работает нормально.
Поскольку Django просто ожидает, что представление будет вызываемым объектом, вы можете поместить его туда, где хотите, в PYTHONPATH. Таким образом, вы можете, например, просто создать новый пакет myapp.views и поместить в него несколько видов модулей. Вам, естественно, придется обновить urls.py и другие модули, которые ссылаются на эти вызовы.
Предположим, что у вас есть файл с именем: password_generator.py
, затем внутри views.py
add: from password_generator import *
Затем вы можете вызвать эту функцию модуля из views.py
.