Вопрос:
Надеюсь, это простой вопрос о нобе. Я работаю над своим первым крупным проектом (иш) Django. Первый инженер проекта выполнял макет кода Django по умолчанию. По мере того как вещи выросли, мы недавно разделили модели на свои собственные каталоги с одним файлом на модель.
Пришло время начать делать то же самое для просмотров. Тем не менее, я не хочу/должен делать все за один раз. Я хотел бы просто начать перемещать вещи из стандартных views.py один за другим, когда я работаю над ними. Однако мне трудно получить urls.py для работы с каталогами представлений и views.py
Это просто вызовет столкновение имен при попытке импортировать “представления” в мой файл urls.py? Является простым ответом просто называть “взгляды” что-то еще, пока я делаю переход? Или просто кусать пулю и делать все сразу?
Лучший ответ:
Прямой ответ: да, у вас есть столкновение имен python. См. Например, класс импорта Python с тем же именем, что и каталог
Вам не нужно делать все это как можно раньше – вы можете просто переименовать/переместить файл views.py или новый каталог представлений. Перемещение нового каталога, вероятно, будет проще всего, тогда у вас не будет изменений существующих маршрутов URL.
Нет ничего особенного в файлах views.py, если ваш urls.py указывает на соответствующую функцию, вы можете разместить их в любом месте и называть их чем угодно.
Ответ №1
Я рекомендую создавать подкаталоги объектов в папке вашего приложения в проекте Django. Затем просто импортируйте их из нового каталога, используя пространство имен app.views, используя команду from… import * incantation. Это приведет к импортированию любых представлений без добавления имени модуля (например, что обычно ссылается на app_name.views.feature_one.view_class становится app_name.views.view_class как вы хотите). Смотри ниже:
# app_name/views.py from feature_one.views import * from feature_two.views import * # … copy views from here # new file: app_name/feature_one/views.py # … paste some views here # new file: app_name/feature_two/views.py # … paste some other views here # new file: app_name/feature_one/__init__.py # … this file can be blank. required for importing «feature_one» like a module # new file: app_name/feature_two/__init__.py # … this file can be blank. required for importing «feature_two» like a module
Теперь, пока ваши взгляды будут распространяться по подкаталогам, все они импортируются с такими же именами в app_name.views поэтому вы все равно можете ссылаться на одни и те же имена в urls.py несмотря на то, что вы переместили некоторые представления в другие файлы.
Ответ №2
Поскольку вы разделили модели на свои суб-приложения, вы можете определить URL-адреса, специфичные для этих под-приложений, в созданных подкаталогах и настроить иерархию URL-адресов. Вот как ваш urls.py умолчанию будет выглядеть так:
from django.conf.urls import include, patterns, url urlpatterns = patterns(», # … snip … url(r’^comments/’, include(‘your_website.comments.urls’)), url(r’^community/’, include(‘your_website.community.urls’)), url(r’^contact/’, include(‘your_website.contact.urls’)), # … snip … )
где комментарии, сообщества и контакты являются вашими недавно созданными суб-приложениями/подкаталогами. Подробнее о том, как работает диспетчер ссылок, здесь