Ajax只返回新消息

时间:2011-05-04 23:30:47

标签: python ajax django

我有这个Django应用程序:

页面顶部有一个表单,其中一个字段用于将消息发送到db,在其下面是全局消息列表。

<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 :(得分:0)

如果我理解正确,您希望返回比表单保存的消息更新的消息列表。您可以从表单中获取时间戳,然后过滤消息以仅获取时间戳大于刚刚保存的消息的消息。我假设你的表单的时间戳字段是forms.DateTimeField变种。

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

修改 如果您只想要比页面上最后一个帖子更新的消息,请发送最后一条消息的ID,然后对其时间戳进行过滤,就像您可以执行以下操作一样:

last_msg = get_object_or_404(Messages, pk=form.cleaned_data['last_msg'])
messages = Message.objects.filter(timestamp__gt=last_msg.timestamp)