Django импортирует просмотры несколько раз в urls.py

#django

#django

Вопрос:

В Django, разве невозможно импортировать несколько представлений из urls.py ?

Например, у меня есть следующий код в urls.py:

 from mysite.books import views
from mysite.contact import views

urlpatterns = patterns('',
    (r'^contact/$', views.contact),
    (r'^search/$', views.search),
)
  

Однако сервер отображает ошибку, если я не отключу одну из пар. Итак, мои вопросы тройственные:

1) Невозможно ли иметь несколько инструкций import views? 2) Как обойти это? 3) Какова наилучшая практика для размещения всех ваших views.py ? Один файл? Несколько файлов? и т.д.

Спасибо.

Комментарии:

1. это не django, а python!

2. Это просто проблема с именованием. Если у вас есть два дочерних элемента, которым вы присваиваете одинаковые имена, вы также не знаете, как изменить ситуацию после, если вы просто хотите вызвать одного из них. Python делает то же самое, в этом случае он использует второй views , который вы определили (перезаписывает первый).

Ответ №1:

1) Да, это так.

2)

 from mysite.books import views as books_views
from mysite.contact import views as contact_views

urlpatterns = patterns('',
    (r'^contact/$', contact_views.contact),
    (r'^search/$', books_views.search),
)
  

3) Согласно документам Django, «Этот код может находиться где угодно, если он находится на вашем Python path».. Я сохраняю все представления приложения в app/views.py

Ответ №2:

Вы можете импортировать столько объектов, сколько захотите, но объекты должны иметь уникальные имена, чтобы их можно было различать.

Есть несколько способов справиться с этим. Один из них заключается в том, чтобы просто импортировать функции, а не модуль:

 from mysite.books.views import books
from mysite.contact.views import contact
  

Очевидно, что это хорошо только в том случае, если у вас есть только одно или два представления в каждом файле. Второй вариант — импортировать модули под разными именами:

 from mysite.books import views as books_views
from mysite.contact import views as contact_views
  

Третий вариант заключается в том, чтобы вообще не импортировать представления, а использовать строки для ссылки на них:

 urlpatterns = patterns('',
    (r'^contact/$', 'contact.views.contact'),
    (r'^search/$', 'book.views.search'),
)
  

Четвертое — иметь отдельные urls.py для каждого приложения и включите urlconfs в основной urls.py .

Комментарии:

1. Благодарю вас за исчерпывающий ответ. Что вы подразумеваете под «Очевидно, что это хорошо только в том случае, если у вас есть только одно или два представления в каждом файле»? В чем недостаток большого количества просмотров с использованием этого метода?

2. Просто вам нужно импортировать их все по отдельности.

Ответ №3:

Я думаю, что другим вариантом было бы:

 urlpatterns = patterns('mysite.books.views',
    (r'^contact/$, 'contact'),
)
urlpatterns  = patterns('mysite.contact.views',
    (r'^search/$, 'search'),
)
  

как описано в djangobook.