Ajax возвращает только новое сообщение - PullRequest
0 голосов
/ 05 мая 2011

У меня есть это приложение Django:

Страница с формой вверху с одним полем для отправки сообщения в базу данных и под ним глобальным списком сообщений.

<body>

<form id="messageForm" action="" method="post">
    {{ form.as_p }}
    <input type="submit" id="go" name="go" value="Go!">
</form>

<div id="msg_list">
    <ul id="update">
        {% for message in messages %}
        <li>{{ message }}</li>
        {% endfor %}
    </ul> 
</div>

</body>

При нажатии на кнопку отправить:

<script>
$(document).ready(function() {
    $("#messageForm").submit(function(event) {
        event.preventDefault();
        data = $("#id_text").val()
        dataString = "text=" + data
        $.ajax({
            type: "POST",
            url: "/sendmsg/",
            data: dataString,
            success: function(html) {
                $("#update").html(html);
                $("ul#update li:first").hide()
                $("ul#update li:first").slideToggle("slow");
            }
        });
        return false;
    });
});
</script>

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

if form.is_valid():
     form.save()
     messages = Message.objects.all()
     render(request, 'message_list.html', {'messages': messages})

и это message_list.html

{% for message in messages reversed %}
<li>{{ message }}</li>
{% endfor %}

Но когда вы нажимаете «отправить», другие пользователи могут отправлять другие сообщения. Я бы вернул только новое сообщение. Я имею в виду сообщения с отметкой времени, более новой, чем отметка времени последнего сообщения, которое я вижу в списке. Я надеюсь, что вы меня поймали.

Как я могу это сделать? Идеи?

1 Ответ

0 голосов
/ 05 мая 2011

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

timestamp = form.cleaned_data['timestamp'] # get timestamp from form, 
messages = Message.objects.filter(timestamp__gt=timestamp) # return only messages newer than timestamp

Редактировать: , если вы хотите, чтобы сообщения были только новее, чем последнее сообщение на странице, отправьтеидентификатор последнего сообщения, а затем фильтр по его временной метке, например, вы можете сделать что-то вроде:

last_msg = get_object_or_404(Messages, pk=form.cleaned_data['last_msg'])
messages = Message.objects.filter(timestamp__gt=last_msg.timestamp)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...