django开发 常见问题及解决方案记录(持续更新)
- 一、如果是a标签的href 或者form表单提交 这种会触发页面刷新的情况,后端函数都可以直接让用户重定向。但是如果是异步请求$.get() 则不可以。**
- 二、在html发起请求有四个方式,第一个是直接写js函数,然后在元素标签通过onclick、submit、href这样的属性来调用,第二个是直接在标签内通过onclick写js语句,第三个是form表单提交,form的action,method+button的type="submit",第四个是a标签的href="/logout/"
- 三、jQuery.inArray()方法
- 四、javascript
- 五、a标签里href="/logout/"和href="logout/"的区别
- 六、html中引入html,extends和include
- 七、form表单输入的数据存储以及view中接口获取前端输入的数据
一、如果是a标签的href 或者form表单提交 这种会触发页面刷新的情况,后端函数都可以直接让用户重定向。但是如果是异步请求$.get() 则不可以。**
第一种情况href+HttpResponseRedirect
欢迎你: <span>{{ username }}</span> <a href="/logout/" style="color: #b097b5;text-decoration: none"> 退出 </a>
def logout(request):
auth.logout(request)
return HttpResponseRedirect('/login/')
第二种情况使用jquery的$.get()发起,这种方法需要引入jquery
<script src="/static/201908059658/js/jquery-1.11.0.min.js" type="text/javascript"></script>
$.get("你的url",{json格式参数},function (ret接收后端的返回值){收到返回值后可以做的事})
这样发起的请求,后端需要返回True,False, 0,1,成功,失败这种字符串,也就是说这个时候后端如果还用HttpResponseRedirect重定向是无效的。示例代码如下:
function login(){
username = document.getElementById('username').value;
password = document.getElementById('password').value;
$.get("/login_action/",{
"username":username,
"password":password
},function (ret){
if(ret == '成功'){
document.location.href = '/home/'
}else{
alert('您的用户名或密码错误!')
}
})
}
def login_action(request):
username = request.GET.get('username', '')
password = request.GET.get('password', '')
user = auth.authenticate(username=username, password=password)
# 用户名和密码在数据库有查到,那么进行验证
if user is not None:
auth.login(request, user)
request.session['user'] = username
return HttpResponse('成功')
else:
return HttpResponse('失败')
二、在html发起请求有四个方式,第一个是直接写js函数,然后在元素标签通过onclick、submit、href这样的属性来调用,第二个是直接在标签内通过onclick写js语句,第三个是form表单提交,form的action,method+button的type="submit",第四个是a标签的href="/logout/"
第一种的代码示例
<button type="submit" onclick="login()" style="">登 录</button>
<scripts>
function login(){
username = document.getElementById('username').value;
password = document.getElementById('password').value;
$.get("/login_action/",{
"username":username,
"password":password
},function (ret){
if(ret == '成功'){
document.location.href = '/home/'
}else{
alert('您的用户名或密码错误!')
}
})
}
</scripts>
第二种,示例代码
<span style="font-size: small;color: grey;">点击
<a href="#" onclick="javascript:document.getElementById('add_project_div').style.display='block'">新增项目</a>
即可创建属于您的新项目!
</span>
这样写就等于下面这样
<span style="font-size: small;color: grey;">点击
<a href="#" onclick="javascript:add_project()">新增项目</a>
即可创建属于您的新项目!
</span>
function add_project(){
document.getElementById('add_project_div').style.
display='block'
}
第三种,
<form action="/goLogin/" method="post">
<div id="fade-box">
<input type="text" name="username" id="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Log In</button>
</div>
</form>
第四种,适用退出登录这种,不需要参数的
<a href="/logout/">登出</a>
三、jQuery.inArray()方法
<script>
if("{{ project.global_datas }}" != "None" && "{{ project.global_datas }}" != ""){
if($.inArray("{{ i.id }}","{{ project.global_datas }}".split(',')) != -1){
document.getElementById("check_{{ i.id }}").checked = "checked"
}
}
</script>
$.inArray() 函数用于在数组中查找指定值,并返回它的索引值(如果没有找到,则返回-1)
提示:源数组不会受到影响,过滤结果只反映在返回的结果数组中。
语法
$.inArray( value, array [, fromIndex ] )
其他的
<body>
<div>"John" 在索引值为 <span></span> 的位置被找到</div>
<div>4 在索引值为 <span></span> 的位置被找到</div>
<div>"Karl" 未被找到,所以返回 <span></span> </div>
<div>"Pete" 在数组中,但是不在索引值大于等于2的位置,所以返回 <span></span></div>
<script>
$(function () {
var arr = [ 4, "Pete", 8, "John" ];
var $spans = $( "span" );
$spans.eq( 0 ).text( jQuery.inArray( "John", arr ) );
$spans.eq( 1 ).text( jQuery.inArray( 4, arr ) );
$spans.eq( 2 ).text( jQuery.inArray( "Karl", arr ) );
$spans.eq( 3 ).text( jQuery.inArray( "Pete", arr, 2 ) );
})
</script>
</body>
四、javascript
s.charCodeAt(x)
输出字符串s的索引x对应的元素的ascii码
var s = "HELLO WORLD";
undefined
s.charCodeAt(0)
72
s.charCodeAt(1)
69
**s.charAt(x) **
输出字符串s的索引x对应的元素
s = "hello world"
"hello world"
s.charAt(0)
"h"
s.charAt(3)
"l"
s.toUpperCase()
字符串s全体转换成大写
"ac fed Adsdsd".toUpperCase()
"AC FED ADSDSD"
s.slice(x)
输出字符串s切割掉索引x对应的元素后,s剩余的字符串,索引x从1开始,0是字符串完整本身
s = "runoob"
"runoob"
s.slice(0)
"runoob"
s.slice(1)
"unoob"
s.slice(1)
"unoob"
五、a标签里href="/logout/"和href="logout/"的区别
欢迎你: <span>{{ username }}</span> <a href="/logout/" style="color: #b097b5;text-decoration: none"> 退出 </a>
/logout/:绝对路径,代表从域名开始拼/logout/,点击后跳转的链接是host/logout/。
logout/ :相对路径,代表从当前路径开始拼上logout/,比如当前页面url是127.0.0.1:8000/home,那么点击后跳转的链接是host/home/logout/。
那又有人说我直接在url写在href里可以不可以?
答案是:当然可以。但是这里跟前面两个的效果都不一样,点击后的会直接跳转href的完整url,本地当前的域名也会被替掉,比如href="https://www.baidu.com",点击后会直接跳转到百度,跟当前域名就没关系。
六、新建django项目常用操作记录,以免遗忘
创建项目:django-admin startproject 项目名
创建应用:进入项目后,django-admin startapp 应用名
同步/生效表结构:在项目根目录下,python3 manage.py makemigrations 和 python3 manage.py migrate
创建后台超级管理员:在项目根目录下,python3 manage.py createsuperuser 然后输入用户名/邮箱/密码等
启动项目
六、html中引入html,extends和include
作为一个组件页面,嵌入到一个主页面,不影响主页面的DOM展示
{% include "menu.html" %}
menu.html会直接覆盖掉原html整个页面,也就是说这样引入后,只会展示menu的内容
{% extends "menu.html" %}
七、form表单输入的数据存储以及view中接口获取前端输入的数据
html
<form action="/login/" method="post">
<div id="fade-box">
<input type="text" name="username" id="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Log In</button>
</div>
</form>
view
def login(request):
username = request.POST.get('username',None)
password = request.POST.get('password',None)
print(username,password)
name="username" ,这里的username是一个变量名,用来代表input标签中输入的数据,而输入的数据值存在value,value属性默认不显示,我们写html时可写可不写,可以通过dom元素.value()来获取值。
request.POST.get('username',None)这里的username就是要get的变量名,与input标签的name属性对应的值是一一对应的关系,否则就会取不到值。
八、登录成功,页面跳转的三个实现方式
def login(request):
username = request.POST.get('username',None)
password = request.POST.get('password',None)
print(username,password)
user = auth.authenticate(username=username,password=password)
print(type(user))
if not user :
# user如果是None,说明用户不存在,跳转到登录页面
return HttpResponseRedirect('/login/') # 重定向
# return render(request,'login.html',{}) # 照抄使用登录页面的返回(不建议使用)
# return loginPage(request) # 调用当前模块的登录页面函数
# user如果有值,说明用户存在,进行登录
auth.login(request,user)
# 登录成功,种cookie
request.session['user'] = username
# 最后跳转到home主页
return HttpResponseRedirect('/home/')