0

我直接输入地址 http://127.0.0.1:8000/boycott/ajaxTot/ 是可以打开的,但是通过httpResponseRedirect跳转的地址却是错误的?
django的路由系统我以为自己明白了,这个例子却把自己弄糊涂了,为什么会出现127.0.0.1:8000/a/b/a/b.html的形式,我路由定义的明明是127.0.0.1:8000/a/b
下面是我的结构图
图片描述

主url.py

from django.contrib import admin
from django.urls import path,include,re_path
from boycott.views import index,login,list

urlpatterns = [
    path('admin/', admin.site.urls),
    path('boycott/', include(('boycott.urls','boycott'),namespace='boycott')),

]

app urls.py

from django.urls import path,re_path
from boycott import views
app_name='boycott'
urlpatterns = [
    path('index/', views.index,name='index'),  #第一啊个参数还不能写 index.html
    path('login/', views.login,name='login'),
    path(r'list/<int:id>/', views.list,{'iid':222},name='list'), 
    path(r'register/', views.register),  
    re_path(r'^list/(?P<id>[0-9]+)/(?P<iid>[0-9]+)/$', views.list,name='list'),  
    path('index/delete/', views.delete,name='delete'),
    
    path('ajaxTot/', views.ajaxTot,name='ajax'),  #其实就是这里不明白,路由地址为什么会重复拼接?而我直接访问 http://127.0.0.1:8000/boycott/ajaxTot/  是正常的,而通过
     
    re_path(r'^bio/(?P<username>\w+)/$', views.bio, name='bio'),
]

这是我index页面的效果图,我通过点击删除后,ajax会把点击按钮的id值发送给后台,后台也能接收到
views.py如下

from django.shortcuts import render
from django.http.response import HttpResponse
# from django.db import models
from django.http import HttpResponseRedirect
from django.shortcuts import render, render_to_response
# from boycott.models import *
from boycott import models

from django.http import HttpResponse
import re


# Create your views here.
def index(res):
    ret = {'data': None, 'group': None}  
    usergroup = models.UserGroup.objects.all()
    ret['group'] = usergroup
    if res.method == 'POST':
        hostname = res.POST.get('hostname', None)
        ip = res.POST.get('m_ip', '8.8.8.88')
        user_group = res.POST.get('usergroup', None)
        models.Asset.objects.create(hostname=hostname, ip=ip, user_group_id=user_group)
    data = models.Asset.objects.filter(bDel=1)
    ret['data'] = data
    return render(res, 'boycott/index.html', ret)  

def login(res):
    print(res)
    ret = {'status': '初始化变量'}
    if res.method == 'POST':
        username = res.POST.get('username', None)
        password = res.POST.get('password', None)
        print(username, password)  # 数据是正常传输的
        is_auth = all([username, password])
        print(is_auth)  # 只有都输入的才进行匹配处理
        if is_auth:
            count = models.Userinfo.objects.filter(username=username, password=password).count()
            # print(models.Userinfo.objects.all().values('password'))  #输出password列
            #   from django.db import models
            #   count = models.Userinfo.objects.filter(username=username,password=password).count()
            #   我这里出问题,就是因为import错了错误的对象,导致django.db.models没有Userinfo属性
            # print(count)
            if count == 1:
                # return HttpResponseRedirect("https://www.baidu.com/")
                return HttpResponseRedirect("/boycott/index")
                # ret['status'] = 'Success'
            else:
                ret['status'] = '用户名或密码错误'
        else:
            ret['status'] = '用户名或密码不能为空'
    return render(res, 'boycott/login.html', {'status': ret['status']})  

# https://docs.djangoproject.com/en/2.0/ref/request-response/

def list(res, id, iid):
    print(id, iid)
    return HttpResponse('list/' + str(id) + '/' + str(iid))


def ajaxTot(res):
    ret = {'data':None}
    print(res.GET)
    # print(res.POST)
    var_p =  res.GET.get('p')
    if re.match('del_id_',str(var_p),flags=0):   #这里需要把参数转字符串,否则会报错
        # return render(res, 'boycott/ajaxTot.html', ret)
        return HttpResponseRedirect('boycott/ajaxTot.html')
    else:
        return HttpResponse('<h1>ajax is NOT OK!</h1>')

图片描述

但是我控制台看到的 ajax的发送地址确实 a/b/a/b 但我url没有这么指定
index.html如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>机器列表</title>
{#    <script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>#}
    <script type="text/javascript" src="../../static/main.js"></script>
</head>
<body>
    <div>
        <form action="{% url 'boycott:index' %}" method="post">
            {% csrf_token %}
            <label for="hostname">主机名</label><input type="text" id="hostname" name="hostname" placeholder="请输入主机名">
            <label for="m_ip">IP地址</label><input type="text" id="m_ip" name="m_ip" placeholder="请输入IP地址">
            <select name="usergroup" id="usergroup">
                {% for item in group %}
                    <option value={{ item.id }}>{{ item.GroupName }}</option>
                {% endfor %}
            </select>
            <input type="submit" value="提交">
        </form>
    </div>
    <div class="machine_list">
        <table border="1">
            <tr>
                <td>主机名</td>
                <td>IP</td>
                <td>用户组</td>
                <td>删除</td>
            </tr>
            {% for item in data %}
                <tr>
                    <td>{{ item.hostname }}</td>
                    <td>{{ item.ip }}</td>
                    <td>{{ item.user_group.GroupName }}</td>
                    <td><input type="button" onclick=loadXMLDoc(this) value="删除" id="del_id_{{ item.id }}" class="btn_class"></td>
                {% comment %}
                    两点不是很明白,点击按钮的时候,是否会给服务器发数据?
                {% endcomment %}
                </tr>
            {% endfor %}
        </table>

    </div>
</body>
</html>

发送ajax的js代码如下

function loadXMLDoc(e){
    console.log("标志进入xml函数"+e.id);
    var xml;
    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
        xml=new XMLHttpRequest();
     }
    else{// code for IE6, IE5
        xml=new ActiveXObject("Microsoft.XMLHTTP");
     }
    xml.onreadystatechange=function(){
        if (xml.readyState==4 && xml.status==200){
            console.log("点击的按钮id为"+e.id);
            console.log("服务器返回的内容为:"+xml.responseText)
        }
    }
    xml.open("GET","../ajaxTot/?p="+e.id,true);  //这里不要多此一举,写成"../templates/ajaxTot/"
    xml.send();
}

图片描述
图片描述
views.py中的def ajaxTot(res)我若是把红框两个位置注释互换位置,则控制台是可以正常显示出来我的页面内容,而不是页面跳转,这个问题困扰了好久,请高人解答,谢谢

2个回答

1

views的ajaxTot方法里

return HttpResponseRedirect('boycott/ajaxTot.html')

改成

return HttpResponseRedirect('/boycott/ajaxTot.html')
0

重定向的话参数应该是 视图函数的名字。不是模板页面的路径,我记得是这样,你再看看。

我一般是这么写重定向的,你看一下。比如登出后重定向到登录界面。

@login_required
def log_out(request):
    logout(request)
    return redirect('log_in')

撰写答案