Я довольно поздно, но я хочу документировать, как объединить и адаптировать решения, представленные d0ugal , таким образом, что он разрешит гораздо более чистый шаблон-код.
У меня есть модель, представляющая контактные лица.
(общий) вид, чтобы получить один ContactPerson выглядит следующим образом:
def contcactperson_detail_view(request, name):
try:
person = ContactPerson.objects.get(slug=name)
except:
raise Http404
if request.is_ajax():
return contcactperson_detail_view_ajax(request, person)
return list_detail.object_detail(
request,
queryset = ContactPerson.objects.all(),
object_id = person.id,
template_object_name = "contactperson",
)
@render_to('cms/contactperson_detail_ajax.html')
def contcactperson_detail_view_ajax(request, person):
return {'contactperson':person, 'is_ajax':True}
Шаблон для визуализации представления, который обрабатывает один ContactPerson называется contcactperson_detail_view.html
:
{% extends "index.html" %}
{% block textpane %}
<h1 id="mainheader">{{ contactperson.first_name }} {{ contactperson.family_name }} </h1>
<div class="indentation"> </div>
{% include 'cms/contactperson_detail_photo.html' %}
<div id="text_pane">
{% include 'cms/contactperson_detail_textpane.html' %}
</div>
{% endblock %}
Она включает в себя два суб- шаблоны
contactperson_detail_textpane.html
<p>{{ contactperson.description }}</p>
<ul>
<li>
<dl>
<dt>Email</dt>
<dd>
{{ contactperson.mail }}
</dd>
</dl>
</li>
<li>
<dl>
<dt>Contact Person for</dt>
<dd>
<ul>
{% for c in contactperson.categories.all %}
<li><a href="{% url category-view c.slug %}">{{ c }}</a></li>
{% endfor %}
</ul>
</dd>
</dl>
</li>
</ul>
и contactperson_detail_photo.html
{% with contactperson.photo.detailphoto as pic %}
{% with pic.url as pic_url %}
<div {% if not is_ajax %}id='imageContainer'{% endif %} style="float: right;padding-right:0.5em;
padding-bottom: 1em; padding-left:0.5em;clear:both;
width:{{ pic.width }}px">
<div style="width:{{ pic.width}}px">
<img style="clear:both" src="{{ pic_url }}" alt="{{ i.name }}"/>
</div>
</div>
{% endwith %}
{% endwith %}
этот 3 шаблона будут использоваться, если запрос не является ajax.
Но если запрос является ajax, contcactperson_detail_view
вернет представление contcactperson_detail_view_ajax
, которое использует шаблон contactperson_detail_ajax.html
для рендеринга. И этот шаблон выглядит следующим образом:
<h1>{{ contactperson.first_name }} {{ contactperson.family_name }}</h1>
{% include 'cms/contactperson_detail_photo.html' %}
{% include 'cms/contactperson_detail_textpane.html' %}
Так он использует те же суб-шаблоны, но ничего не расширяясь, поэтому только необходимо Разметка доставки. Поскольку представление ajax передает is_ajax = True
в шаблон, его можно использовать для настройки незначительных вещей, например, для установки правильных идентификационных атрибутов.
Контекстно-процессорный или дополнительный url-conf не требуется.
Наконец код Javascript:
$("#contact_person_portlet a").click(function(event){
event.preventDefault();
$.ajax({
type: "GET",
url: event.target.getAttribute('href'),
success: function(msg){
overlay(msg);
}
});
});
Надеется, что это будет полезно для некоторых людей. Если да, оставьте комментарий!
Это то, с чем я играл, но в то время я не знал, как много javascript, как я знаю, поэтому просто отправьте объекты как JSON, сделайте из него объектные литералы javascript, а затем tablediv.innerHTML = foo ? – Joel
JSON * - это объектный литерал, поэтому приятная вещь об использовании его в javascript заключается в том, что вам не нужно ничего с ним делать, чтобы на самом деле использовать его, как только он у вас есть. Мне нравится использовать JSON в сочетании с системой шаблонов, с которой я связан выше (jquery, а не прототип, извините), поскольку вы можете просто передать JSON, вернувшись прямо к шаблону, который вы настроили, и он будет работать. – Steerpike