Вернуть модели Django для рендеринга шаблонов после запроса Ajax - PullRequest
1 голос
/ 02 октября 2011

Я хотел бы создать поиск по AJAX для моей веб-страницы. Пока я могу отправить данные формы и сделать соответствующий вызов моей модели Django. С чем мне тяжело, так это просто отослать Queryset обратно и отрисовать его с помощью системы шаблонов Django. Ваша помощь / совет очень ценится.

Вот код, с которым я работаю.

views.py

if request.is_ajax():
    if request.method == 'POST':
        format = 'json'
        mimetype = 'application/json'
        try:
            q = request.POST['obj']
            o = Object.objects.filter(name__icontains=q)
            return render_to_response( 'project_view_objects.html', {'username': request.user.username, 'results':o})

view.html

<script>
    $(document).ready(function(){

    $("#search_form").submit(function(event)
    {
        event.preventDefault();


        $.ajax({
            type: "POST",
            url: "/objects/search/",
            data: $(this).serialize(),
            processData: false,
            dataType: "json"
            });
    });});
</script>

<article>
    <blockquote>
        <form class="create_form" id="search_form">
            <p>
                <input id="objectSearchNameInput" type="text" name="obj" value="Object name">
                <input type="submit" value="search objects">
            </p>
        </form>
    </blockquote>
</article>
<br />

{% if results %}
<blockquote>
    <aside class="column">
        {% for object in results %}
            <b><a href="#" class="extra-text-special">{{ object.name }}</a></b><br />
        {% endfor %}
    </aside>
    <aside class="column">
        {% for object in results %}
            <font class="extra-text-nospecial">{{ object.created_when }}</font><br />
        {% endfor %}
    </aside>
</blockquote>
{% else %}
    <p>haha</p>
{% endif %}

На данный момент все, что я вижу на странице, это «ха-ха».

Ответы [ 3 ]

5 голосов
/ 02 октября 2011

Что вам не хватает, так это то, что шаблон уже был обработан к моменту запуска AJAX - как, конечно, должно быть, потому что шаблоны на стороне сервера, а javascript на стороне клиента.

Таким образом, нужно сделать так, чтобы ваши представления Ajax не возвращали JSON, а отображали шаблоны, которые ваш обратный вызов Javascript затем вставляет в шаблон.

2 голосов
/ 04 октября 2011

это окончательный ответ

питон

if request.is_ajax():
    if request.method == 'POST':
        format = 'json'
        mimetype = 'application/json'
        try:
            q = request.POST['obj']
            #message = {"object_name": "hey, you made it"}
            o = Object.objects.filter(name__icontains=q)
        except:
            message = {"object_name": "didn't make it"}
        #m = str(q['id'])
        #json = simplejson.dumps(message)
        #data = serializers.serialize(format, o)
        #return HttpResponse(data, mimetype)

        html = render_to_string( 'results.html', { 'username': request.user.username, 'objects': o } )
        res = {'html': html}
        return HttpResponse( simplejson.dumps(res), mimetype )

HTML

<script>
    $(document).ready(function(){

    $("#search_form").submit(function(event)
    {
        event.preventDefault();

        $.ajax({
            type: "POST",
            url: "/objects/search/",
            data: $(this).serialize(),
            processData: false,
            dataType: "json",
            success: function( data ){
                    $( '#results' ).html( data.html );
                }
            });
    });});
</script>

. , .

<article>
    <blockquote>
        <form class="create_form" id="search_form">
            <p>
                <input id="objectSearchNameInput" type="text" name="obj" value="Object name">
                <input type="submit" value="search objects">
            </p>
        </form>
    </blockquote>
</article>
<br />
<aside id="results">
</aside>
0 голосов
/ 02 октября 2011

Моим решением было использование Dajax, создание небольших шаблонов фрагментов, например, для рендеринга списка. Затем отобразите их в функциях Dajax и запишите их в документе с помощью соответствующих вызовов javascript. Вы можете увидеть пример (и на самом деле вся документация по dajax довольно хорошая): http://www.dajaxproject.com/pagination/

Другое решение, которое я недавно нашел (но сам не пробовал): http://www.jperla.com/blog/post/write-bug-free-javascript-with-pebbles

Наконец, вы можете пойти совершенно другим путем и использовать Backbone.js, но таким образом вы (более или менее) столкнетесь с той же проблемой, как обмен шаблонами магистрали с шаблонами django (я думаю, вы должны быть в состоянии написать тег шаблона, который в зависимости от 'mode' записывает либо значение, либо базовый тег шаблона, что позволяет вам повторно использовать ваши шаблоны)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...