页面内容
- 标题编辑栏
- 文章内容编辑栏
- 提交按钮
这里需要一些html的知识。
新建一个模板文件edit_page.html,添加代码如下:
<body>
<form action="" method="post"> <!--请求方法post-->
<label>文章标题
<input type="text" name="title">
</label>
<br>
<label >文章内容
<input type="text" name="content">
</label>
<br>
<input type="submit" value="提交">
</form>
</body>
这里用的是一个form表单,可以自行搜索学习相关知识(慕课网的不错(慕课网会不会给我广告费?))。
下一个步骤是编写渲染函数:
def edit_page(request):
return render(request,'blog/edit_page.html')
紧接着是配置URL:
url(r'^edit/$',views.edit_page),
这样我们就可以在浏览器中看见一个傻傻的简单界面,我们离成功又迈进了一步,好像还缺点什么,对了,我们的编辑还不能提交,那么就让我们来想一想如何提交吧。
我们可以在后端使用request.POST['参数名']
获取表单数据,GET等方法同理,这是一个字典对象。 models.Article .objects.create(title,content)创建对象。了解理论知识后当然要实践,进入views.py添加函数:
def edit_action(request):
title = request.POST.get('title','TITLE')
content = request.POST.get('content','CONTENT')
models.Article.objects.create(title=title,content=content)#创建文章对象
articles = models.Article.objects.all()
return render(request, "blog/index.html", {'articles': articles})
还记得在模板文件中form中的action属性吗?这时候它就要发挥作用了,action="{% url 'blog:edit_actioin' %}"
,添加的是方法名,当然最后千万不要忘记配置URL:
url(r'^edit/action$',views.edit_action,name="edit_actioin"),
,万事俱备,我们打开服务器,在地址栏小心的输入地址,激动地按下回车,哎!我去!报错了。提示了一堆什么都不懂的东西,好像有几个字母挺明显的,按照国际惯例,我们复制粘贴去搜索它。
CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
看起来是安全问题那怎么解决呢?
又查了一下解决方法,嗯,方法如下:在所有的 POST 表单元素时,需要加上一个 {% csrf_token %} tag,我们再去试一试,哇噻!成功了。
可是我们发现从文章页面点击修改文章按钮得到的是空的编辑页面,我们需要的是修改文章,而不是从头写一个,这该怎么办呢?其实很简单。
首先我们要知道id作为文章的标识可以得到文章的标题和内容,那么就让我们来修改views.py中的edit_page函数
def edit_page(request,article_id):
if str(article_id) == '0':
return render(request,'blog/edit_page.html')
article = models.Article.objects.get(pk = article_id)
return render(request,"blog/edit_page.html",{'article':article})
我们添加了一个id参数,紧接着判断了id是否为零,为零的话就直接返回编辑页面,如果不为零就将article传给编辑页面。然后我们来修改编辑页面,同理要添加一个判断
{% if article %}
<input type="hidden" name = 'article_id' value = '{{ article.id }}'>
<label>文章标题
<input type="text" name="title" value="{{ article.title }}">
</label>
<br>
<label>文章内容
<input type="text" name="content" value="{{ article.content }}">
</label>
<br>
{% else %}
<input type="hidden" name = 'article_id' value = '0'>
<label>文章标题
<input type="text" name="title">
</label>
<br>
<label>文章内容
<input type="text" name="content">
</label>
<br>
{% endif %}
如果传了article对象就将两个input的值改为标题和内容,否则你懂得。接着是配置URL
url(r'^edit/(?P<article_id>[0-9]+)$',views.edit_page,name="edit_page"),
,给编辑页面添加标识,大功告成有没有?打开服务器,网特? 我们似乎忘记了一件事,我们并没有传id,好吧。来到文章页面<a href="{% url 'blog:edit_page' article.id %}">修改文章</a>
,来到主页<a href="{% url 'blog:edit_page' 0 %}">新文章</a>
然后修改后台响应函数:
def edit_action(request):
title = request.POST.get('title','TITLE')
content = request.POST.get('content','CONTENT')
article_id = request.POST.get('article_id',"0")
if article_id == '0' :
models.Article.objects.create(title=title,content=content)#创建文章对象
articles = models.Article.objects.all()
return render(request, "blog/index.html", {'articles': articles})
article = models.Article.objects.get(pk = article_id)
article.title = title
article.content = content
article.save()
return render(request,'blog/article_page.html',{'article':article})
嗯完美!