Частичные шаблоны ответов Django - PullRequest
1 голос
/ 24 января 2012

Считается ли это правильным / есть ли подводные камни в возврате частичных шаблонов в запросы ajax POST?

Например:

if request.is_ajax:
    # response is just the form 
    return render(request, 'contact/fields.html', {'form':form})

Ответы [ 5 ]

2 голосов
/ 24 января 2012

Наиболее типичным подходом является возврат JSON, а затем создание любого необходимого HTML-кода на стороне клиента из данных JSON.Тем не менее, можно утверждать, что это смешивает представление с поведением, и было бы лучше четко отделить HTML.

С другой стороны, возврат блока HTML примерно такой же, как полярный юг "RESTful ", как вы можете получить.В чистой философии REST представления должны возвращать данные в стандартном и повторно используемом контейнере (например, JSON или XML).Позже, если вам нужно вытащить форму в iOS / Android / WP7 / и т. Д.среда приложения, а не веб-страница, JSON / XML также пригодится вам, тогда как HTML-код практически бесполезен.

Я легко вижу оба аргумента, и я не думаю, что один из них обязательно более прав, чемдругой.В конечном счете, я думаю, что вы просто должны делать то, что лучше всего подходит для вашего приложения, и то, что вам кажется правильным.Подумайте о том, что более легко обслуживать и расширять для ваших конкретных обстоятельств.

1 голос
/ 24 января 2012

Я еще не пробовал это с формой POST-запроса, но очень похоже, что мы возвращаем частичный HTML-запрос AJAX GET, чтобы сделать изменения страницы без загрузки всей страницы.Я думаю, что это будет хорошо работать и для запроса формы (на самом деле мы сейчас обсуждаем, следует ли использовать этот подход на странице с несколькими различными формами).

Думаю, если все сделано правильно, это неплоходизайн шаблона.Мы достигаем этого, изменяя, какой базовый шаблон расширяется в зависимости от того, был ли это вызов AJAX.

Упрощенный пример:

### view
base_template = "base.html"
if request.is_ajax():
    base_template = "base-ajax.html"
return render_to_response(request, 'page.html', {'base_template': base_template})

### page.html
{% extends base_template %}
{% block main %}new page content{% endblock %}

### base.html
<html>
<!-- complete html page -->
...    
{% block main %}this is what changes per page{% endblock %}
...
</html>

### base-ajax.html
{% block main %}this is what changes per page{% endblock %}
0 голосов
/ 24 января 2012

Я сделал это для пары диалогов JQuery. Содержимое диалога запрашивается с помощью AJAX-запроса, содержимое отображается на стороне сервера, а затем возвращается и отображается. До сих пор у меня не было никаких проблем с этим.

0 голосов
/ 24 января 2012

Из личного опыта могу сказать, что подводных камней нет.У меня просто не очень хороший дизайн шаблона (не хорошая практика).Я делал это в довольно загруженном проекте.

0 голосов
/ 24 января 2012

Я думаю, что большинство моих ответных ответов ajax возвращают элементы DOM, а не всю форму.

(пример)

...
person = ''' <a href="/person/{0}" class="normalMenu">{1} {2}</a>'''.format(p.id, p.first_name, p.last_name)
q = simplejson.dumps({"person":person})
return HttpResponse(q, mimetype="application/json")

Вышеприведенное отправляет простой элемент DOM в шаблон и вставляет его в таблицу внизу. Скольжение справа налево.

Если вы отправите обратно весь шаблон, весь экран будет мигать и не получит никаких скользких анимаций. В любом случае, это мое понимание.

...