环境:python3.6 django2.1
今天照着一本书上练习django的session功能时,发现使用form表单提交时总是403错误,我在form表单中也使用了{% csrf_token %}
,其他的感觉也没错,但是折腾了一上午,我发现是按照书上的思路导致我形成的思维定式了,根源是出在views.py中,说起来,知道错误后感觉自己好二。。。话不多说,直接上代码了
login.html的代码
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆分享日记</title>
</head>
<body>
<nav>
<div>分享日记</div>
<ul>
<li><a href="/">HOME</a></li>
{% if username %}
<li><a href="/logout">注销</a></li>
<li><a href="/post">写日记</a></li>
<li><a href="/admin">后台管理</a></li>
{% else %}
<li><a href="/login">登陆</a></li>
<li><a href="/contact">联络管理员</a></li>
{% endif %}
</ul>
</nav>
<div>
{% if message %}
<div>{{ message }}</div>
{% endif %}
<div>
<h3>登陆我的私人日记</h3>
</div>
<form action="." method="post">
{% csrf_token %}
<label for="user_name">你的姓名:</label>
<input id="user_name" type="text" name="user_name">
<label for="user_color">你喜欢的颜色</label>
<input id="user_color" type="text" name="user_color">
<button type="submit" value="设置">提交</button>
</form>
</div>
</body>
</html>
这个是错误的views.py的代码
from django.shortcuts import render, HttpResponse, redirect, render_to_response
from django.template.loader import get_template
def login(request):
# 如果是POST方法提交
if request.method == 'POST':
# 查看窗体属性的正确性
username = request.POST['user_name']
usercolor = request.POST['user_color']
message = "登陆成功"
response = render_to_response("login.html", locals())
response.set_cookie('username', username)
response.set_cookie('usercolor', usercolor)
else:
# 这里出的错
response = render_to_response("login.html")
return response
这个是改正后的views.py代码
from django.shortcuts import render, HttpResponse, redirect, render_to_response
from django.template.loader import get_template
def login(request):
# 如果是POST方法提交
if request.method == 'POST':
# 查看窗体属性的正确性
username = request.POST['user_name']
usercolor = request.POST['user_color']
message = "登陆成功"
response = render_to_response("login.html", locals())
response.set_cookie('username', username)
response.set_cookie('usercolor', usercolor)
else:
# 改成render就好了...
response = render(request, "login.html")
return response