[Это очередная статья в рамках сравнения ASP.NET MVC и django. Оглавление и обзор]
На первый взгляд оба подхода очень похожи:
Вот django:
-
<ul>
-
{% for athlete in athlete_list %}
-
<li>{{ athlete.name }}</li>
-
{% endfor %}
-
</ul>
А вот microsoft mvc:
C#/ASP.NET MVC
-
<% foreach (var item in Model) { %>
-
<li>
-
<%= Html.Encode(item.Name) %>
-
</li>
-
<% } %>
На самом деле в них есть коренные различия.
В MVC, как и в обычном ASP.NET aspx или ascx страница представляет собой смесь разметки html и рабочего языка проекта (скорее всего C#). Теги <% anything%> являются портами в языковую среду, тут доступны любые объекты и методы .net. Теги <%= anything%> позволяют подставить вместо себя результат выполнения подставленной конструкции.
В django страница шаблона представляет собой html файл со вставками специального языка разметки шаблона. Этот язык содержит теги {% %}, и вставыши {{ }}, аналогично MVC. Также содержимое вставышей можно модифицировать с помощью фильтров: {{ myvar|lower}}. Обзорно, джанго предоставляет сразу много полезных фишек для разметки: cycle для раскраски зеброй и других нужд, empty ветки в циклах (для надписи «Нет данных»), …
Однако мы отвлеклись от самого важного момента. Повторю, язык внутри тегов в джанго не является языком питон. Каждый разработчик тега волен интерпретировать информацию внутри тега как ему угодно: как выражения питона, как простые строки, или как мусор.
|
Неправильный синтаксис внутри тега asp.net mvc вызовет ошибку компиляции. |
Внутри тега django может быть все, что угодно: за интерпретацию ответственнен разработчик тега. |
Я не знаю, что сподвигло разработчиков django сделать то, что они сделали. Это решение замедляет развитие языка разметки и вносит путаницу. Это резко усложняет разработку своих тегов (если они достаточно функциональны, конечно. Это практически не позволяет делать суперпозицию тегов. Я надеюсь, найдется грамотный в джанго человек, который сможет исправить эту ситуацию.
Замечательной особенностью asp.net mvc является наличие функциональности Ajax.ActionLink().
-
<%= Ajax.
ActionLink("Press me",
"About",
new AjaxOptions
{ UpdateTargetId
= "id1" } )%>
-
<div id = "id1">
-
</div>
Функциональность ActionLink позволяет сделать ajax-страницы без написания кода на javascript/jquery. В это примере мы поместили на страницу тег <a>Press me</a>. При нажатии на который с помощью аякса загружается контент, спрятанный за урлом About (на самом деле это action). Загруженный контент помещается в элемент с id=’id1’.
Кроме того, доступны удобные опции:
- Можно изменять способ вставки контента: замена/вставка снизу/вставка сверху.
- Можно задать строку для вопроса-подтверждения (при нажатии вылезет окошко и спросит, «точно?»).
- Можно указывать javascript методы, срабатывающие при нажатии на линк, после загрузки контента и др.
Замечательно то, что на html странице в итоге появляется вполне простой код:
-
<a href="/Home/About" onclick="Sys.Mvc.AsyncHyperlink.handleClick(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, updateTargetId: 'id1' });">Press me
</a>
Таким образом, можно легко строить красивые аякс-интерфейсы, без программирования на аякс!
К сожалению, я не смог найти подобного механизма в джанго, поэтому там приходится аяксовую функциональность руками (благо она не сложная).
Приходилось.. До вчерашнего дня.
Ваш покорный слуга подумал: что я, хуже разработчиков из microsoft? И портировал эту функциональность для django =)
При этом я воспользовался любезно предоставленными javascript-библиотеками MicrosoftMvcAjax: на клиенте все работает так же, как в asp.net mvc. Необходимо было написать лишь генератор html кода.
-
{% action MyAction updateTargetId=id1, insertionMode=replace %}
-
{% url default %}
-
{% endaction %}
В ближайшее время я устраню несколько недочетов и залью это на djangosnippets.
Кроме того, если есть желающие, я могу рассказать о написании обработчика тегов для django.