Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB
Oct. 8, 2018, 9:16 a.m.

Как лучше описывать Generic View в Django? в файлах urls.py или во views.py

Django, urls, views, Generic

Добрый день, дорогие пользователи EVILEG!

Вот и я решил задать вопрос на своём форуме. Надеюсь на отклик. Давайте обсудим один вопрос.

Мне не даёт покоя одна мысль, где лучше прописывать Generic вьюшки в Django.

В документации есть два варианта, как использовать Generic вьюшки.

Первый вариант . Прописать всю информацию в Generic вьюшке прямо в файле urls.py

from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path('about/', TemplateView.as_view(template_name="about.html")),
]

Второй вариант . Наследоваться от Generic вьюшки, описать параметры во views.py, а потом уже подключить эту вьюшку в файле urls.py

views.py


from django.views.generic import TemplateView

class MyView(TemplateView):
    template_name = "about.html"

urls.py


from django.urls import path

from myapp.views import MyView

urlpatterns = [
    path('about/', MyView.as_view()),
]

Мне не даёт покоя одна мысль, даёт ли какой-то бонус в производительности или потреблении памяти, если наследоваться от Generic вьюшки, когда нужно переопределить 5-6 атрибутов, да или даже всего 1 атрибут. Или лучше сразу прописывать всё как в первом варианте прямо в urls.py. Или это скорее уже вопрос код стайла, который имеется внутри команды разработчиков?

Кто-нибудь задавлся подобным вопросом или проводил тесты подобного вопроса?




8

Вообще, выигрыша никакого не получится, поскольку все инициализируется в один момент (загрузки приложения), а не on-demand, как PHP. Однако, архитектурно, более правильным вариантом я считаю - наследование. Поскольку, чуть позже, если захочется развить эту вьюху, все равно придется выносить в отдельный модуль.

0

Вот и я склоняюсь к решению с наследованием, тем более, что когда нужно описать 5-6 атрибутов, то файл urls.py становится менее красивым, чем хотелось бы.

Но сам по себе вопрос возник из того, что я стараюсь разрабатывать сайт абстрагируясь от конкретных реализаций контента, таким образом имеется одна общая часть, которая работает одинаково для статьей, комментариев, разделов, сообщений на форуме и т.д. В итоге появляется один кастомный GenericView, который благодаря метамагии Python обрабатывает сразу 5-6 url в файле urls.py для всех этих типов контента, и будет обрабатывать в будущем ещё 10, 20 да сколько потребуется.

Вот и возникает вопрос. Писать на каждый url свою вьюшку или оставить всю инициализацию в urls.py.

Хотя если всё прописать в views.py, то чисто на взгляд проще будет отрефакторить, поскольку код там читабельнее, но в итоге рефакторинг приведёт к тому, что появится новый GenericView, который будет описываться в urls.py и всё по новому...

Я так постоянно хожу по кругу с рефакторингом...


0

Явное лучше, чем не явное.

не надо экономить байты кода=)

а по поводу урлов - ради абстракции их можно хранить же вместе с представлением. и и любом другом проекте можно будет сделать include('....urls').


а что обрабатывает GenericView? может быть было бы правильнее вынести это в middleware, а сами вьюхи оставить чистыми?

0

Эти дженерики у меня обрабатывают формирование запроса в зависимости от модели данных и подставновку нужных шаблонов для формирования ListView объектов.

Но там есть ещё и немного JavaScript, который отвечает за частичную загрузку страницы при пагинации. Это реализовано для активностей, подписок и избранного в личном профиле пользователя, при пагинации на главной странице сайта. И ещё кое-где.

Поэтому не думаю, что это тот функционал, который имеет смысл выносить в middleware...


0

я не до конца понял - без кода сложно. в целом, я считаю, что мета-программирование - такое себе занятие. и нужно быть КРАЙНЕ осторожным с его применением=) а то насмотрелся=))) отлаживать, или, простихоспади, исправлять что-то - превращается в адовый ад=)

0

После дебага шаблонов на Qt/C++ с сигналами и слотами мета-программирование на Python мне не кажется таким уже сложным )))

Но согласен, что здесь нужно подходить осторожно. Я мета-программирование со всякими getattr , __name__ , __class__ применяю только для реализации общего, по факту библиотечного функционала, но это требует, чтобы код вылежался до стабильного состояния. Я поэтому медленно вывожу базовые исходники сайта в ESNF-C . По сути считаю весь не выведенный в Open Source функционал в качестве pre-alpha unstable .

0

не, __name__, __class__ и все прочее - еще пока даже не мета-программирование. я имею в виду создание классов и функций на летуне по шаблону, а на основе каких-то миксинов или того хуже - из ничего. а то был у меня опыт писать возможность расширения функционала - был создан базовый класс, от которого надо было наследоваться другому человеку и несколько статических параметров, типа url-а и названия страницы. человек описывал нужное, описывал нужную выделенную логику. а в момент инициализации сервера строилось дерево URL-ов и связанные вьюхи. такое себе, конечно, но по другому было бы сложно - человек не умел в джангу. а так ему надо было все описывать в одном месте.

0

Не, ну это конечно треш... такая шаблонизация - это что-то из ряда вон выходящее...

Как бы шаблонная логика на проверке наличия тех или иных атрибутов - это одно, а если создавать классы из "чего-то" просто потому, что другой человек не умеет этого чего-то сам - это конечно что-то из ряда вон выходящее... Я за адекватные шаблоны!



0

Comments

Only authorized users can post comments.
Please, Log in or Sign up
v
Jan. 17, 2019, 11:51 a.m.
vitalir12

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:20points,
  • Rating points-10
v
Jan. 17, 2019, 11:49 a.m.
vitalir12

C++ - Test 002. Constants

  • Result:50points,
  • Rating points-4
v
Jan. 17, 2019, 11:13 a.m.
vitalir12

C++ - Тест 003. Условия и циклы

  • Result:28points,
  • Rating points-10
Last comments
I
Jan. 16, 2019, 8:06 a.m.
IscanderChe

Заработало. Забыл model->select(); вписать.
I
Jan. 16, 2019, 8:02 a.m.
IscanderChe

Всё равно пусто, хотя строка с данными в базу добавляется.
Jan. 16, 2019, 7:51 a.m.
Евгений Легоцкой

потому, что нужно сохранять информацию для всех остальных ролей и столбцов через вызов переопределённого метода. Да к тому же вы ещё и зациклили вызов метода data. QVariant MySqlTableModel:...
I
Jan. 16, 2019, 7:43 a.m.
IscanderChe

Сделал вот так. В tableView ничего нет, кроме заголовка. QVariant MySqlTableModel::data(const QModelIndex &index, int role) const{ if (role == Qt::DisplayRole) { QTime ...
Now discuss on the forum
Jan. 17, 2019, 1:40 p.m.
Михаиллл

Спасибо, заработало.Учту с переменными.
Jan. 17, 2019, 12:01 p.m.
Алексей Внуков

у меня просто есть отдельное поле с чекбоксамими какие колонки нужно отображать CheckBox { id: checkBox text: qsTr("some text") checked: true onC...
Jan. 15, 2019, 4:53 p.m.
Михаиллл

Спасибо, заработало.Но выдало обычный текст без форатирования HTML.Придется искать дальше
Jan. 15, 2019, 12:52 p.m.
BlinCT

Я же вам выше написал CLion умеет работать с ремоут машинами. И Qt так же собирает.
Join us in social networks

For registered users on the site there is a minimum amount of advertising