Какой хороший способ форматировать ответы AJAX? Или, используя Django на основе AJAX - PullRequest
1 голос
/ 06 мая 2010

В некотором коде, над которым я работаю, автор max AJAX вызывает представление Django, которое возвращает JSON.

Как только JSON будет извлечен, он будет внедрен в страницу с функцией, которая выглядит следующим образом (обратите внимание, это упрощение, но я уверен, что вы знаете, что я получаю здесь):

function build_event_listing(events) {
    var html = '';

    for(int i = 0; i < events.length; i++) {
        event = events[i];

        html += "<h2>" + event.title + "</h2>\n";
        html += "<p>" + event.description + "</p>";
        html += "Click <a href='/event/view/" + event.id + "'>here<a> for more info.";

    }

    events_div.html(html);
}

Мне действительно не нравится этот подход. Чтобы изменить внешний вид каждого списка событий, дизайнеру придется изменить этот уродливый JS. Я бы предпочел использовать систему шаблонов Django, но мне интересно, как я могу это сделать?

У меня была идея написать вид так:

def view_listings(req):
    events = models.Event.objects.all()

    html = []
    for event in events:
        html.append(
            render_to_string('event/single_event.html', {
                'event': event,
            }, context_instance=RequestContext(req))

    return HttpResponse(''.join(html), mimetype='text/html')

... но кажется, что должен быть лучший способ.

Есть идеи?

Ответы [ 5 ]

1 голос
/ 07 мая 2010

Взгляните на проект jquery-haml .Он использует вариацию очень приятного, компактного Haml и разработан специально для таких ситуаций, как ваша.

1 голос
/ 07 мая 2010

Я написал библиотеку Django / Ajax, которая организует это для вас. Вы пишете свой шаблон так:

{% load ajax %}
{% adjax_include "event/_event_list.html" %}

По вашему мнению, вы бы сделали что-то вроде:

import adjax

@adjax_response
def view_listings(req):
    events = models.Event.objects.all()
    adjax.render_to_response("event/_event_list.html", {'events': events})

Существует также тег шаблона, который помечает одно значение для замены, например, {% adjax event.title %} и затем adjax.update(request, event, ('title', 'description', 'id')) в представлении. Но в настоящее время это только отдельные объекты, а не наборы запросов. Хотя это хорошая идея, я мог бы быстро ее реализовать.

См. http://adjax.hardysoftware.com.au/how/

1 голос
/ 07 мая 2010

Вызов Ajax может так же легко вернуть визуализированный HTML, который ваш Javascript может просто вставить на страницу.Поэтому используйте заманчивую систему для рендеринга этого фрагмента HTML, а затем верните его в JS.

0 голосов
/ 07 мая 2010

Я мог бы использовать модифицированную версию Tempest: http://plugins.jquery.com/project/tempest

Изменено для использования [[]] и [%%] вместо {{}} и {%%}, потому что система шаблонов django будет их использовать.

0 голосов
/ 06 мая 2010

Почему бы не использовать возможности цикла for языка шаблонов django?

{% for event in events %}
...
{% endfor %}

и вы звоните через:

render_to_string('event/events_template.html', {'events':events}, context_instance=RequestContext(req)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...