django开发 常见问题及解决方案记录(持续更新)

一、如果是a标签的href 或者form表单提交 这种会触发页面刷新的情况,后端函数都可以直接让用户重定向。但是如果是异步请求$.get() 则不可以。**

第一种情况href+HttpResponseRedirect

欢迎你: <span>{{ username }}</span>&nbsp;<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>&nbsp;<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/')
posted @ 2022-04-05 19:06  我是一言  阅读(57)  评论(0编辑  收藏  举报