javascript - 更改 URL 和内容而不刷新 django

标签 javascript python jquery django ajax

我正在通过此 url /inbox/<str:username> 从我的 django 响应中获取 json 响应获取与该用户对话中所有消息的 json 响应。 问题始于收件箱页面,该页面将线程和聊天框保存在同一页面上,例如 Instagram,如下所示 Chat Inbox

但可以看出,我希望网址与用户名一样。假设当我单击带有虚拟的线程时,我希望 url 类似于“inbox/dummy”,但在此我的 url 是“/inbox”,这不会让我启动用于消息传递的套接字,我的views.py 呈现此收件箱模板是

收件箱查看次数

thread_objs= Thread.objects.by_user(user=request.user)
    l=len(thread_objs)
    chat_objs=[]
    for i in range(l):
        chat_objs.append(list(thread_objs[i].chatmessage_set.all()).pop())

    
    chat_objs_serialized=[]
    for i in range(l):
        chat_objs_serialized.append(json.dumps(ChatMessageSerializer(chat_objs[i]).data))
    for i in range(l):
        print(chat_objs_serialized[i])
    
    thread_objs_list=[]
    
    for i in range(l):
        thread_objs_list.append(json.dumps(ThreadSerializer(thread_objs[i]).data))
    
    return render(request,'uno_startup/inbox.html',context={"Threads":thread_objs_list,"Messages":chat_objs_serialized})

现在,当我单击一个线程时,它的内容应该加载到屏幕的右侧,就像 inbox.html 的 javascript 一样,即此图像中的此页面。

收件箱的 JavaScript

<body>
<div class='container'>
    <div class='row'>
        <div class="col-md-4" id ="Threadholder">
            <ul id ="Threadbox">
            {% for object in threads %}
                <li><a href=" ">{% if user != object.first %}{{ object.first }}{% else %}{{ object.second }}{% endif %}</a></li>
            {% endfor %}
            </ul>

        </div>    
    
        <div class="col-md-8" id="Chatholder" >
            <ul id="Chatbox">

            </ul>
     
            
         <form id="form" method="POST">
                 <input type="hidden" value="{{ user.username }}" id="myusername">
                 <input type="text" id="chat_message">
                 <input type="submit" class="btn btn-primary">
         </form>
            
        </div>
    </div>
</div>
<script>
    var threads={{ Threads|safe }};
    var messages={{ Messages|safe }};
    const l=threads.length
    const threadholder=$("#Threadbox")
    for(i=0;i<l;i++){
        var data=JSON.parse(threads[i])
        var Message=JSON.parse(messages[i])
        var username =data.second.username
        if (username=="{{ user.username }}"){
            username=data.first.username
        }
        
        var thread=document.createElement("li")
        var main=document.createElement("a")
        
        var div=document.createElement("div")
        var username_holder=document.createElement("p")
        div.className="thread"
        
        var p=document.createElement("p")
        
        p.innerText=Message.message
        
        username_holder.innerText=username
        div.appendChild(username_holder)
        div.appendChild(p)
        main.appendChild(div)
        thread.appendChild(main)
        threadholder.append(thread)
        
    };
function add_message(message){
            
            message=JSON.parse(message)
            const chatholder=$("#Chatbox")
            
            console.log(message.user.username)
            const chat_message= document.createElement("li")
            var div= document.createElement("div")
            var p = document.createElement("p")
            var sender=message.user.username
            var text=message.message
            p.innerText=text
            div.appendChild(p)
            chat_message.appendChild(div)
            if(sender=="{{ user.username }}"){
                chat_message.className="user"
            }
            else{
                chat_message.className="other"
            }
            chatholder.prepend(chat_message)
            
        }
        $(document).ready(function(){
        $("li").click(function(){
            $("#Chatbox").empty()
        
            
            var other_user= this.children[0].children[0].children[0].innerText

            fetch(`/inbox/${other_user}`).then(response => response.json())
                .then(data => data.messages.reverse().forEach(add_message)) 
                
                
          })
        
        })

这是返回 json 响应的函数

查看 json 响应

thread=Thread.objects.get_or_new(user=request.user,other_username=username)
    messages=thread[0].chatmessage_set.all()
    l= len(messages)

    messages_serialized=[]
    for i in range(l):
        messages_serialized.append(json.dumps(ChatMessageSerializer(messages[i]).data))
    print(messages)
    return JsonResponse({"messages":messages_serialized})

这个聊天函数是通过这个url /inbox/<str:username> 调用的 我想要一种方法,可以帮助我在不重新加载的情况下打开线程,并更新 url,我使用了 AJAX 但它没有帮助,因为它还给我提供了来自 django 的 Json 响应的页面,更改了原始页面。

失败的 AJAX 实现

<script>
    var threads={{ Threads|safe }};
    var messages={{ Messages|safe }};
    const l=threads.length
    const threadholder=$("#Threadbox")
    for(i=0;i<l;i++){
        var data=JSON.parse(threads[i])
        var Message=JSON.parse(messages[i])
        var username =data.second.username
        if (username=="{{ user.username }}"){
            username=data.first.username
        }
        
        var thread=document.createElement("li")
        var main=document.createElement("a")
        
        var div=document.createElement("div")
        var username_holder=document.createElement("p")
        div.className="thread"
        
        var p=document.createElement("p")
        
        p.innerText=Message.message
        
        username_holder.innerText=username
        div.appendChild(username_holder)
        div.appendChild(p)
        main.appendChild(div)
        thread.appendChild(main)
        threadholder.append(thread)
        
    };
function add_message(message){
            
            message=JSON.parse(message)
            const chatholder=$("#Chatbox")
            
            console.log(message.user.username)
            const chat_message= document.createElement("li")
            var div= document.createElement("div")
            var p = document.createElement("p")
            var sender=message.user.username
            var text=message.message
            p.innerText=text
            div.appendChild(p)
            chat_message.appendChild(div)
            if(sender=="{{ user.username }}"){
                chat_message.className="user"
            }
            else{
                chat_message.className="other"
            }
            chatholder.prepend(chat_message)
            
        }
        $(document).ready(function(){
        $("li").click(function(){
            $("#Chatbox").empty()
        
            
            var other_user= this.children[0].children[0].children[0].innerText
            <script>
    var threads={{ Threads|safe }};
    var messages={{ Messages|safe }};
    const l=threads.length
    const threadholder=$("#Threadbox")
    for(i=0;i<l;i++){
        var data=JSON.parse(threads[i])
        var Message=JSON.parse(messages[i])
        var username =data.second.username
        if (username=="{{ user.username }}"){
            username=data.first.username
        }
        
        var thread=document.createElement("li")
        var main=document.createElement("a")
        
        var div=document.createElement("div")
        var username_holder=document.createElement("p")
        div.className="thread"
        
        var p=document.createElement("p")
        
        p.innerText=Message.message
        
        username_holder.innerText=username
        div.appendChild(username_holder)
        div.appendChild(p)
        main.appendChild(div)
        thread.appendChild(main)
        threadholder.append(thread)
        
    };
function add_message(message){
            
            message=JSON.parse(message)
            const chatholder=$("#Chatbox")
            
            console.log(message.user.username)
            const chat_message= document.createElement("li")
            var div= document.createElement("div")
            var p = document.createElement("p")
            var sender=message.user.username
            var text=message.message
            p.innerText=text
            div.appendChild(p)
            chat_message.appendChild(div)
            if(sender=="{{ user.username }}"){
                chat_message.className="user"
            }
            else{
                chat_message.className="other"
            }
            chatholder.prepend(chat_message)
            
        }
        $(document).ready(function(){
        $("li").click(function(){
            $("#Chatbox").empty()
        
            
            var other_user= this.children[0].children[0].children[0].innerText

           $.ajax({
            type: "GET",
            url: {% url 'Chat' username=other_user %}, 
            data: {'Messages': messages}
        })
        .done(function(response) {
            console.log(reposne)
        });
                
          })
        
        })
                         
                
          })
        
        })

最佳答案

您的 Django View 正在重新加载页面,因为它返回内容类型 HTML 的响应,而不是 JSON。

而不是

return render(request,'uno_startup/inbox.html',context={"Threads":thread_objs_list,"Messages":chat_objs_serialized})

做类似的事情

from django.http import JsonResponse
...
return JsonResponse({"Threads": thread_objs_list, "Messages": chat_objs_serialized})

您仍然应该使用 JavaScript/AJAX 从前端获取此响应。

至于如何在不引起页面刷新的情况下更改URL,请引用this answer .

关于javascript - 更改 URL 和内容而不刷新 django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64112703/

相关文章:

javascript - 打开建议时从输入中删除底部边框半径

javascript - 如何在 $(document).ready(function(){}) 中使用 for 循环?

javascript - 如何增加 bigvideo.js 的加载时间?

python - Numpy - 仅更改数组一列的值的更简单方法?

jquery - 在 Pyramid 项目中使用日期选择器 jQuery 小部件

javascript - 菜单关闭 Canvas 错误移动

javascript - 你如何获得单选按钮以使用 jquery 更改 html 中的文本颜色?

python - Numpy 中每一行的 `vectorize`

python - 换行符出现在屏幕上但不出现在电子邮件中

javascript - 删除所有按下的按键事件