Django 学习笔记 - 提交表单及发表文章

提交表单及发表文章

提交表单

1. html表单

<form method="POST" action=""> {% csrf_token %}
    <input type="text" name="title" />
    <textarea name="content"></textarea>
    <button type="submit">发表</button>
</form>
  • input 标签 自开自闭
  • textarea 标签 多行文本框 有开闭标签
  • submit 按钮 html表单 一定要有一个submit按钮
  • {% csrf_token %} 一定要写在form后面

2. 后台处理

if request.method == "GET":
    return render_to_response("xxx.html", 
    {},
    context_instance=RequestContext(request))
else:
    title = request.POST["title"].strip()
    content = request.POST["content"].strip()
    # do anything

csrf 跨站请求伪造

  • A为可信站点,B为危险站点。
  • 在A登录后,没有退出,然后访问B网站。
  • B网站伪造了一个表单,从用户的浏览器提交到A网站。提交到A网站的请求,浏览器会自动带上认证信息,结果A网站认证通过。
  • 如果这个请求是修改密码,用户的账号就被盗了。

Django 防止CSRF

  • 给form表单添加一个隐藏字段,一个每个浏览器都不一样的随机码。
  • 后端验证随机码是否存在。
  • 危险网站无法提前探知随机码,也就无法伪造请求了。
  • {% csrf_token %}

什么是context(环境)

context_instance = RequestContext(request)
  • 没有来之前就已经存在的东西就是环境
  • 模板中不用定义就可以使用的变量就是环境
  • render_to_response 的第二个参数,那个字典,就是环境。
  • RequestContext(request) 是由请求对象提供的环境,提供了一些模板可以使用的变量,这些变量是从请求中解析出来的。csrf_token 就在其中。
  • from django.template import RequestContext

位置参数与关键字参数

  • do_something(1) 位置参数
  • do_something(in=1, out=2) 关键字参数
  • do_something(1, out=2) 位置参数在前,关键字参数在后
  • def do_anything(*args, **kwargs): pass
  • args 是位置参数集合,是列表,*解列表为位置参数
  • kwargs 是关键字参数集合,是字典, ** 是解字典为关键字参数

uls 与 reverse

{% url 'URL名称' 位置参数 关键字参数=值 %}
reverse('URL名称', args=[位置参数], kwargs={关键字参数})
  • 作用相同
  • url用于模板中,html中。
  • reverse 用于控制器中,python中。
  • 他们得到的返回值都是一样的,都是字符串,就是解析出来的url。

消息组件

from django.contrib import messages

添加消息( 消息级别:DEBUG, INFO, SUCCESS, WARNING, ERROR)

message.add_message(request, messages.ERROR, u'标题和内容不能为空')
...
context_instance=RequestContext(request)

消息展示

{% if messages %}
    {% for message in messages %}
        <div class="alert alert-info"> {{ message }} </div>
    {% endfor %}
{% endif %}
  • 消息只展示一次。
  • 给request变量增加了消息属性。
  • message增加在这个请求上面,然后这个请求包装成一个请求环境,传给了模板,所以模板上就有了这个消息。
  • message实际上是存在数据库中。在任何地方添加消息之后,如果你一直不输出,一直不在模板上展示这个消息,让这个消息一直存着,就算是这个请求返回之后,这个消息也不丢失,直到有一次,页面里面传入了请求的环境,然后再页面里面展示了消息,这些消息就会被展示出来(包括以前没有展示的)。

帖子详情页面

  • 数据模型:已定义
  • URL:/article/detail/<article_id>
  • 控制器:展示一个页面
  • 模板:继承与base.html,用bootstrap美化,展示必要信息

作业

  • 文章列表页面,增加“发表文章”的按钮
  • 增加发表文章的页面及功能
  • 发表成功/失败有消息提示
  • 文章列表页面,文章的标题为链接,可点击,点击跳转到文章详情
  • 完成文章详情

/article/views.py 注意的代码

from django.core.urlresolvers import reverse
from django.contrib import messages
from django.contrib.auth.models import User
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext

def create_article(request, block_id):
    block_id = int(block_id)
    block = Block.objects.get(id=block_id)
    if request.method == "GET":
        return render_to_response("article_create.html", {"b": block},
                                context_instance=RequestContext(request))
    else:  # request.method == "POST"
        title = request.POST["title"].strip()
        content = request.POST["content"].strip()
        if not title or not content:
            messages.add_message(request, messages.ERROR, u"标题和内容均不能为空")
            return render_to_response("article_create.html",
                    {"b": block, "title": title, "content": content},
                    context_constance=RequestContext(request))
        owner = User.objects.all()[0]  # TODO:
        new_article = Article(block=block, owner=owner, title=title, content=content)
        new_article.save()
        messages.add_message(request, messages.INFO, u'成功发布文章')
        return redirect(reverse("article_list", args=[block.id]))

注意:python str.format()格式化中文

import sys
reload(sys)  # 如果没法直接调用setdefaultencoding()方法就加上这句
sys.setdefaultencoding('utf-8')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容