Django第七课:博客撰写页面

页面内容

  • 标题编辑栏
  • 文章内容编辑栏
  • 提交按钮
    这里需要一些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})

嗯完美!

    原文作者:海深不蓝_
    原文地址: https://www.jianshu.com/p/b16585b1be7a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞