有点司机带您拟: Django+Xadmin打造在线教育平台[Python2&3通用 ](三)-3&4&5

3-3 django orm介绍与model设计

上节课程完成后代码(来读本节前置条件):

github仓库地址:https://github.com/mtianyan/DjangoGetStarted

  • 对承诺commit: 留言板前端页面显示。本次内容了教程3-2完结。

可能现在您还于通过手写sql语句来操作数据库,当我们有了orm,数据库操作变得不可开交简短。这同一稍微节咱们来学Django中的orm。

原生sql 与 orm

没orm 的情形下message/views.py代码:

import MySQLdb

# 使用原生sql获取书的列表
def book_list(request):
    # 创建到数据库的连接: 指明用户名,数据库,密码
    db = MySQLdb.connect(user = 'me', db='mydb', passwd='secret', host='localhost')
    # 创建一个游标对象执行器
    cursor = db.cursor()
    # 书写我们需要的sql语句
    cursor.execute('SELECT name FROM books ORDER BY name')
    # 对于fetchall()的结果做遍历,将遍历回来的结果当做数组,取第0个值name。
    names = [row[0] for row in cursor.fetchall()]
    db.close()

可不可以给数据库字段的查询与下类似的一个性一样简单?没错登登登:orm上场了

book:name

book.name
book.save()

Django的orm就是以吃咱们不再写点那样的言辞,而是像苟操作数据库像使用类和类属性一样。

文 || 郁 林

创我们的models

verbose_name:对象的人类可读之称号,单数:

verbose_name = "pizza"

class Meta,内嵌于 UserMessage 这个类的定义中
如果 class Publisher 是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统
你可以在任意一个 模型 类中使用 Meta 类,来设置一些与特定模型相关的选项。
如:设置ordering = ['name'],默认地都会按 name 字段排序

message/models.py:

# 继承于django.db.models.Model
class UserMessage(models.Model):
    # 设置最大长度,verbose_name在后台显示字段会用到
    name = models.CharField(max_length=20, verbose_name=u"用户名")
    # Django提供内置的邮箱字段会帮忙验证` default_validators = [validators.validate_email]`
    email = models.EmailField(verbose_name=u"邮箱")
    address = models.CharField(max_length=100, verbose_name=u"联系地址")
    message = models.CharField(max_length=500, verbose_name=u"留言信息")


    class Meta:
        verbose_name = u"用户留言信息"
        # db_table ,这里我们让它自动生成所以不用指定

此刻我们执行makemigrations messages会发现并没变动。

mark

因setting中我们无注册我们的app: message

注意:新建的app都要在setting中注册

答应公众号来修之约,郁林作领读达人,为杨绛先生的大作《我们仨》写了扳平系列书评,一共12篇。此也郁林解读《我们仨》系列之第1篇,下同样篇:

当setting中注册我们的app

DjangoGetStarted/settings.py 大概36行INSTALLED_APPS:

`INSTALLED_APPS`
[
    前面的不用变,后面新增下一行
    'message'
]

此时我们再运行Tools 菜单下 Run manage.py Task会提示:

苟提示:

SyntaxError: Non-ASCII character '\xe7' in file D:\CodeSpace\PythonProject\DjangoGetStarted\apps\message\models.py on line

请求小心或而忘掉在写了中文的地方长:

#coding: utf-8

留神要加于首先要么二行。

接下来实施下发号施令:

makemigrations message

mark

migrate message 生成数据表

mark

前往Navicat验证:

mark

好观看咱们的数据表已经创办成功。默认数据表名称为app名称_类名转换为小写
自动生成的id作为主键。

杨绛同钱钟书:婚姻好不好,都在这些细节里
||【《我们仨》02】

Models讲解

除过普通的对应数据库的字段类型如CharField,还有为数不少高档项目。如EmailField提供email验证。

    models.ForeignKey     # 外键
    models.DateTimeField  # 时间字段
    models.IntegerField   # 整型
    models.IPAddressField # IP地址
    models.FileField      # 上传文件
    models.ImageField     # 图片

ctrl按停+左键点击models
进入后点击fields蘑菇到文件开始好望所有字段:

__all__ = [str(x) for x in (
    'AutoField', 'BLANK_CHOICE_DASH', 'BigIntegerField', 'BinaryField',
    'BooleanField', 'CharField', 'CommaSeparatedIntegerField', 'DateField',
    'DateTimeField', 'DecimalField', 'DurationField', 'EmailField', 'Empty',
    'Field', 'FieldDoesNotExist', 'FilePathField', 'FloatField',
    'GenericIPAddressField', 'IPAddressField', 'IntegerField', 'NOT_PROVIDED',
    'NullBooleanField', 'PositiveIntegerField', 'PositiveSmallIntegerField',
    'SlugField', 'SmallIntegerField', 'TextField', 'TimeField', 'URLField',
    'UUIDField',
)]

介绍字段参数

CharField务必指明默认最酷尺寸。null=True,blank=True指明字段可以为空
defalut = " "依赖定默认值。

name = models.CharField(max_length=20,null=True,blank=True, verbose_name=u"用户名")

id是自动生成的,如果需要打定义主键,message/models.py中上加字段:

object_id = models.CharField(primary_key=True, verbose_name="主键")

此时点击Tools 菜单下 Run manage.py Task输入makemigrations message

mark

知识点:CharField必须指明最酷长

object_id改为:

    object_id = models.CharField(primary_key=True, max_length=50 ,verbose_name="主键")

这时候点击Tools 菜单下 Run manage.py Task输入makemigrations message

You are trying to add a non-nullable field 'object_id' to usermessage without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py

基于提示信息,我们要被object_id上加默认值:

    object_id = models.CharField(primary_key=True, max_length=50,default="", verbose_name="主键")

get新知识点:object_id必须有默认值

输入2 退出:然后输入makemigrations message

mark

还输入下面发号施令生成数据表

migrate message 

好看来上图过程遭到会报我们举行了怎么变化,如剔除了默认系统生成的主键id
,变更了name。新增了咱们的object_id

前去Navicat验证右键设计表:

mark

足看object_id现已变成我们的初主键。

每当炎黄,有这么一个家中:

介绍Meta信息:

Meta信息遭到我们可以指定常见的型:

db_table = "user_meassage"

由定义后生成表,表名会与我们的保持一致。而无见面前缀appname如:message_

这里因为咱们曾经特别成了了,就绝不开说明改变表名了。

ordering = '-object_id'

ordering指定默认排序字段,如:就会盖object_id倒序

verbose_name_plural = u"用户留言信息"

verbose_name_plural:复数信息,便于人看。否则会以后台显示用户留言信息s

曾经读了了orm将数据表映射表。
github地址:https://github.com/mtianyan/DjangoGetStarted
此节终止对许github commit:

留言板数据库orm映射成表完成。内容了教程3-3竣工。

女儿从小即跟爸爸最“哥们”,两总人口一齐读书一同玩闹,是无话不谈的好伴侣。

3-4 django model的增删改

github仓库地址:https://github.com/mtianyan/DjangoGetStarted

  • 达到小节完成代码对应commit:
    留言板数据库orm映射成表完成。内容了教程3-3竣工。

message/views.py中:

from .models import UserMessage

拿我们刚刚创建的model,import进来。.意味着是与当下同级的目。

遵循下图所显示添加同漫长测试数据。

mark

下一场再我们的getform法中添加脚代码:

def getform(request):
    # UserMessage默认的数据管理器objects。
    # 方法all()是将所有数据返回成一个queryset类型(django的内置类型)
    all_message = UserMessage.objects.all()

    #我们可以对于all_message进行遍历操作
    for message in all_message:
        # 每个message实际就是一个UserMessage对象(这时我们就可以使用对象的相关方法)。
        print message.name

    return render(request, 'message_form.html')

调剂过程:

mark

  • 点击上图小红框位置,打及断点。

  • 点击Run -> debug后:在浏览器里打开:http://127.0.0.1:8000/form/

mark

  • 弹来落得图表示都入断点。

mark

  • 这时鼠标左键点击:all_message.可以看来就是一个{QuerySet}类型的对象,里面存放着[<UserMessage: UserMessage object>]

  • f6如运行及下同样步。此时凡的值窗口内可以看到message的价。说明我们成取到了数据库的值。

mark

爸爸调皮如顽童,趁女儿熟睡时,用墨笔在其脸上写胡子,在肚子上画画鬼脸。

filter取出指定要求值

all_message = UserMessage.objects.filter(name=' mtianyan', address='西安')

mark

仍地方调试过程更调试好看来我们同取出了价值。

稍练:将名字改成吧跟投机数据库存放值不同之。查看结果。

mark

化为了空列表,说明整是。

老子时常编顺口溜,为幼女由充满箩筐的绰号,以“猪噘嘴、牛撞头、蟹吐沫、蛙凸肚、红猢狲”等形象之号称来打来她。

拿数据存入数据库

打听:django/db/models/base.py 源码中提供save方法

def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):

getform方法吃补充加代码:

 # 存储部分

    # 首先实例化一个对象
    user_message = UserMessage()

    # 为对象增加属性
    user_message.name = "mtianyan2"
    user_message.message = "blog.mtianyan.cn"
    user_message.address = "西安"
    user_message.email = "1147727180@qq.com"
    user_message.object_id = "efgh"

    # 调用save方法进行保存
    user_message.save()
  • 由上断点:如下图。

mark

  • 直惦记f6独自步调试,直到如下图:蓝色到return语句

mark

可以以生方值窗口查到值

mark

父亲热衷让令女外文单词,但经常是数小发俗气的说话,女儿小小年纪不明所以,在旁观者面前鹦鹉学舌般一样停顿叽里呱啦,引得客人捧腹大笑,她亦洋洋得意,塌鼻子都抬起来。

Navicat进行求证

可以看成功之补加了数量mtianyan2

mark

父女俩会晤连成一扶助于母亲反,不铺设床不叠被,还嘀咕:“狗窠真舒服。”

哪自html的交付中取得到数码并保留进数据库

templates/message_form.html:

mark

method是post。action就是凭于我们在urls.py中布局的/form/
前方必须加以斜杠指根路径下form
中间的input会自动将价值传递让后台:这时我们尽管足以在getform中落到刚传递过来的值。

运行品种:然后输入需要填写的值。点击提交:出现403不当

Forbidden (403)
CSRF verification failed. Request aborted.

根据提示:我们的页面没有进展crsf的证实,这时django的安康体制,不容许任意form都于后台提交。

知识点:所以我们要在html页面中加入csrf_token

    {% csrf_token %}

mark

原那行删除掉。打及断点

mark

刷新页面并提交。这时候在价值窗口可见到request对象下之POST中存放着咱提交的多寡。内容如下

<QueryDict: {u'message': [u'\u54c8\u54c8'], u'address': [
u'\u897f\u5b89\u5e02'], u'csrfmiddlewaretoken': [
u'uIYSMOTWPJBPOPucRwd3uDaWtCzeEaem'], u'name': [
u'\u5929\u6daf\u660e\u6708\u7b19'], u'email': [u'1147727180@qq.com']}>

mark

数以dict:key-value 形式储存 key是出于如下图html中的name所主宰对应的。

mark

母女俩会面并成一相助,笑爸爸是色盲,只认得四种颜色。

数据库新增。

request.POST遭受数据取出,存入user_message对象

 # html表单部分

    # 此处对应html中的method="post",表示我们只处理post请求
    if request.method == "POST":
        # 就是取字典里key对应value值而已。取name,取不到默认空
        name = request.POST.get('name', '')
        message = request.POST.get('message', '')
        address = request.POST.get('address', '')
        email = request.POST.get('email', '')

        # 实例化对象
        user_message = UserMessage()

        # 将html的值传入我们实例化的对象.
        user_message.name = name
        user_message.message = message
        user_message.address = address
        user_message.email = email
        user_message.object_id = "ijkl"

        # 调用save方法进行保存
        user_message.save()
  • 打断点在产图位置:

mark

  • 跻身调试:点击点击method:是get请求。因为我们连从未循提交按钮,而是get这个网页

mark

  • 点击f8接续运行我们的类型 浏览器被填入表单内容点提交。

mark

以这次是表单提交,已经成了post方式。按f6拓展单步调试。

直单步到如下图蓝色

mark

这候值浏览窗口可以看

mark

检查我们的user_message对象的性质是否都全副长进去,

下f8 继续路并去Navicat验证

mark

好望咱们的数据库被曾经新增,标志在我们已打响存入数据。

父母亲见面并成一扶,说女儿是学究,是木头,是白痴。

除去数据。

于查询及之数量做去:

# 方法2 :filter取出指定条件值,逗号代表and 必须同时满足两个条件才返回。
all_message = UserMessage.objects.filter(name='mtianyan', address='西安')

# 我的数据库里保存着可以匹配到该条数据的一行。

# 删除操作:使用delete方法删除all_message

all_message.delete()

    for message in all_message:
        # 删除取到的message对象
        message.detele()
        # print message.name

点击run并访问:http://127.0.0.1:8000/form/
进入Navicat进行认证。

mark

可以看出我们的那长长的mtianyan + 西安之数现已被删除。

时至今日:我们早就学会了新增,删除,查询。

本节结github对承诺commit:

django model的增删改数据库。本次内容了教程3-4。

以斯老婆子,有“最才的女,最贤的嫁”,女儿是阿妹,是姐姐,是妈妈;爸爸是弟弟,是哥哥,是子;妈妈是姐姐,是阿妹,是幼女,一家人亲切,风雨飘摇的胡世里,甜蜜地生存。

3-5 django url templates配置

项目Github地址:https://github.com/mtianyan/DjangoGetStarted
本节始发对应相应Github的commit:django
model的增删改数据库。本次内容了教程3-4。

本节拿介绍url的布置,以及怎样以数据库数据填充充回前台html页面。

现象:只同意用户改mtianyan,如果没有就长,如果出就是揣使用户可以修改。

眼看便是钱钟书、杨绛、钱瑗“我们仨”的家。

取出数据

message/views.py中的getform方法中

    message = None
    all_message = UserMessage.objects.filter(name='mtianyan', address='西安')

    # if 判断是否存在数据
    if all_message:
        # all_message是一个list,可以使用切片。
        message = all_message[0]

此处注意把前面几节约写的去掉

这样的下,是无是你梦寐以求的?

拿数据填至html中

修改return render

return render(request, 'message_form.html',{
        "my_message" : message
})   

此前面的”my_meassage”是我们得活动命名的。会产生一个my_message目标就返回前端页面。

人数尤为长大越能够体会家庭之关键。在破碎之家长大的儿女,用二三十年经历换来的少数体味,大概幸福家庭的孩子从小就已经解;用小半生精力取得的某些腾飞,大概幸福家庭长大的人头短期稍有些用力就可知有所。如作者这般,一路下挫跌撞撞,碰壁无数,追其源,还是自幼缺少温暖家庭之滋养。

当前者页面被推广入值。

呢input系列标签添加value:
使用my_message.name落到我们传递过来的my_message靶的属性值。

        <input id="name" type="text" name="name"  
        value="{{ my_message.name }}" class="error" placeholder="请输入您的姓名"/>

伸手自行完成姓名,邮箱,联系地址三单input标签。

textarea标签添加值

mark

        <textarea id="message" name="message"  
        placeholder="请输入你的建议">{{ my_message.message }}</textarea>

运行品种,访问:http://127.0.0.1:8000/form/

mark

打响!!我们都将后台数据库数据成功展示暨前台。

一个采暖美好的人家发生差不多重要?它是福之来源,是一生不变的血肉,是自认同的基于,是传统、世界观、道德观形成的平台,是人生最珍贵的财,是咱们一生辛苦从并底终极目标。而且温暖美好的家拥有传递性,“我们仨”羡煞旁人的大团结甜蜜正是为了杨绛老人的门之深刻影响。

template模板渲染着之片段用法。

当咱们的template模板被呢便是form.html中,不允许我们写Python的语法,
它们提供了平套自己的内建标签。

合法文档中template内建标签从而法传送门

幸福之家园里,连幸福都发自着同等的含意,那就是是夫妻恩爱和沿,儿女可爱活泼,一家人相濡以沫风雨同舟,任其是乱世飘摇还是丢人安稳,都相信此生没有生离、唯有死别。

常用的几种模板标签介绍:

设若“我们仨”这个堪称完美的书香的寒,是礼仪之邦幸福家庭中最全面的则,是聊人口终其一生孜孜以求的美好理想。

if - else

法定提供模板如下:

mark

个人执行:

mark

满足if运行结果:

mark

不满足if:如改为my_message.name == "mtianyan1"运作结果:

mark

夫小之主妇杨绛先生以涉了丧女丧夫之痛后,饱含深情地做了家在回忆录《我们仨》。这按照开分为两组成部分。第一部分受,作者为其稳定的智慧、独特之笔法,用梦境之样式讲述了最终几年遭受一样小老三人相依为命的真情实意体验;第二片段,以诚实感人之文字记录了打1935年夫妇二丁前往英国留学并当牛津欢喜得爱女,直至1998年先生去世,63年内这个家中鲜为人知的坎坷过程。

ifequal & ifnotequal

mark

合法文档解释:ifequal a b
相当于f a == b.ifnotequal虽相当给if a != b

民用执行:

mark

结果为:未找到中文昵称

《我们仨》自2003年7月出版,一年内销售近50万本,杨绛先生因本书成为“2003年华顶有影响力的女人物”和“2003年份中国文学女士”。截至2011年,《我们仨》一同台重印24次,在好书推荐排行榜上长远居于不产,深受读者好评。

slice

mark

法定文档解释:其实就算是片操作。从头开始切到第n只。

民用执行:

mark

本来mtianyanmtianyan1举凡例外之,但是片后前八位相同。
运作结果显示 :对应中文昵称:天涯明月笙

URl的号设置技巧

DjangoGetStarted/urls.py:

r'^form/$'补偿加别名:

    url(r'^form/$', getform, name = "form_new")

通往html中修改action地址也底所示:

<form action="{% url "form_new" %}" method="post" class="smart-green">

这时我们而改变urls.py中之r'^form/$'无待再次修改前端代码中值。

咱仨系列:

url先后顺序问题

注意url匹配规则遭到必然毫无遗忘/$标志代表为form/截止的才见面使得。不会见为后连续配合。比如没有/$

    url(r'^form', getform, name="form_new")

这时候我们进来浏览器访问时输入http://127.0.0.1:8000/formemmm都可给响应。

mark

专门是设下还配置起给这规则包含的条规,会发让写以更依靠前之掣肘停得无至正确处理的Bug。

mark

达到图我们是怀念使为formtest响应admin.site.urls。但是会于form提前拦截停。

故此我们终将要留心加上/$符号。

至今我们完成了留言板项目:学习到了Django必备的基础知识。
下同样段我们以启我们的进阶学习:开发在线教育平台网站。

本章结束:

针对诺Commit: 留言板项目上好,本次内容了教程3-5。完结,撒花。
项目Github地址:https://github.com/mtianyan/DjangoGetStarted

01 咱俩仨 :一个采暖美好的家园发生多重要?【《我们仨》01】

02 杨绛与钱钟书:婚姻好不好,都当这些细节里 ||【《我们仨》02】

05 钱钟书: 最萌的爸爸,最痴的其【《我们仨》05】

06 咱们仨:父母爱阅读,对儿女的震慑来差不多分外【领读《我们仨》06】

内容相关红楼系列: 情相关红楼梦