Разделить view.py в нескольких файлах - программирование

Разделить view.py в нескольких файлах

Мой views.py стал слишком большим и трудно найти правильный вид.

Как мне разбить его в нескольких файлах, а затем импортировать? Связано ли это с потерей скорости?

Могу ли я сделать то же самое с models.py?

4b9b3361

Ответ 1

В 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 *

Я действительно не знаю о проблемах скорости (но я сомневаюсь, что они есть).

Для моделей это может быть немного сложно.

Ответ 2

Я должен был сделать это раньше (ради ясности)

То, как я это делал, это создать каталог 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;)

Ответ 3

В принципе, вы можете поместить свой код, если хотите. Просто убедитесь, что вы соответствующим образом меняете инструкции импорта. для представлений в urls.py.

Не зная ваш фактический код, трудно предположить что-то значимое. Возможно, вы можете использовать какой-то префикс имени файла, например. views_helper.py, views_fancy.py, views_that_are_not_so_often_used.py или так...

Другой вариант - создать каталог views с __init__.py, где вы импортируете все подзаголовки. Если у вас есть потребность в большом количестве файлов, вы можете создать больше вложенных представлений, поскольку ваши представления растут...

Ответ 4

Простой ответ: Да.

Лучше всего создать каталог с именем views, а затем в urls.py do:

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

Ответ 5

Поскольку Django просто ожидает, что представление будет вызываемым объектом, вы можете поместить его туда, где хотите, в PYTHONPATH. Таким образом, вы можете, например, просто создать новый пакет myapp.views и поместить в него несколько видов модулей. Вам, естественно, придется обновить urls.py и другие модули, которые ссылаются на эти вызовы.

Ответ 6

Я разделяю почти все представления в своих приложениях в папку представлений (с init.py, конечно). Тем не менее, я не импортирую все подпрограммы в init.py, как некоторые из предложенных ответов. Кажется, что все работает нормально.

Ответ 7

Я играл с помещением в мой 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, поэтому я все еще смотрю, какой эффект он оказывает на скорость/безопасность/простоту использования.

Ответ 8

Просто для обмена, у меня было немного проблем с ответом Винсента Демейстера. Все в порядке, за исключением файла init.py, я должен написать следующим образом:

__ __ INIT ру:.

from .viewsa import *
from .viewsb import *

Таким образом, мне все равно не нужно менять метод import в urls.py. Я на Python 3.6.1 и Django 1.11.4.

Ответ 9

Предположим, что у вас есть файл с именем: password_generator.py, затем внутри views.py add: from password_generator import *

Затем вы можете вызвать эту функцию модуля из views.py.