Как правильно обновить div, используя Jquery/Ajax в шаблоне Django

Я попытался реализовать решение здесь, но я не могу заставить его работать правильно.

У меня есть div, который заполняется с помощью цикла внутри шаблона Django. Прямо под этим у меня есть поле ввода, где я могу ввести текст и нажать кнопку Отправить. Действие Submit должно запустить сценарий Jquery, который получает объект модели с сервера. Этот модельный объект должен затем быть передан в div, а затем div должен быть "обновлен". Намерение здесь состоит в том, что после обновления div переменная, к которой обращается цикл for, будет обновлена, что будет отображать дополнительные новые результаты.

Код моего шаблона:

<h1> This is a Test Ajax Page</h1>
<div id="refresh-this-div">
    {% for comment in question.comment_set.all %}
        <p class="">{{ comment.body }}</p>
    {% endfor %}
        <input id="my-text-input-id" type="text" />
        <button type="submit" class="add-comment-button">Add</button>
    </div>
</div>

Мой Jquery:

<script type="text/javascript">
    $(document).ready(function() {
        $("button.add-comment-button").click(function() {
            var com_body = $('#my-text-input-id').val();
            $.ajax({
                    url: '/test_login_url',
                    success: function(data) {
                    $('#refresh-this-div').html(data);
                    }
                  });
        });
    });
</script>

Мой взгляд:

def test_login_url(request):
    question = Question.objects.get(id=1)
    com = Comment(question=question, body='This is a new Comment!')
    question.comment_set.add(com)
    return render_to_response('application/ajax_test_template.html', { 'question': question })

Когда я нажимаю кнопку "Отправить", div обновляется, однако обновленный раздел div теперь содержит копию тега h1. Когда я нажимаю Отправить несколько раз, появляются дополнительные теги h1 и комментарии.

Вот пример страницы перед нажатием: before_clicking_submit

И вот пример после нажатия кнопки Отправить: after_clicking_submit

Я дважды проверил, что моя реализация максимально идентична решению, на которое я ссылался ранее, однако я чувствую, что, возможно, здесь упускаю что-то простое. Как правильно обновить div с новой обновленной переменной?

2 ответа

HTML вернулся с вашего test_login_url вид, что вы звоните через ajax включает элемент h1 в ваш шаблон. В вашем обратном вызове ajax success вы загружаете этот HTML, который включает h1, в ваш refresh-this-div div, но вы не удаляете старый элемент h1, который находится вне контейнера. Быстрая проверка DOM с помощью инструментов разработчика в вашем браузере должна проиллюстрировать происходящее.

Возможно, самое простое решение - это обернуть содержимое вашего текущего шаблона в контейнер.

Код шаблона:

<div id="refresh-this-div">
    <h1> This is a Test Ajax Page</h1>
    {% for comment in question.comment_set.all %}
        <p class="">{{ comment.body }}</p>
    {% endfor %}
    <input id="my-text-input-id" type="text" />
    <button type="submit" class="add-comment-button">Add</button>
</div>

Jquery:

$(document).ready(function() {
    $("button.add-comment-button").click(function() {
        var com_body = $('#my-text-input-id').val();
        $.ajax({
                url: '/test_login_url',
                success: function(data) {
                    // grab the inner html of the returned div 
                    // so you don't nest a new div#refresh-this-div on every call
                    var html = $(data).filter('#refresh-this-div').html();
                    $('#refresh-this-div').html(html);
                }
        });
    });
});

$(data).filter у меня не работает, поэтому я подсунул «данные» в виде строки, чтобы извлечь нужную мне часть HTML. Меня устраивает.

Другие вопросы по тегам