Xadmin塑造在线教育平台,小司机带您学

3-3 django orm介绍与model设计

上节科目达成后代码(来读书本节前置条件卡塔尔(قطر‎:

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

  • 对应commit: 留言板前端页面突显。这次内容甘休教程3-2结束。

兴许今后你还在经过手写sql语句来操作数据库,当大家有了orm,数据库操作变得超级轻松。这一小节大家来学学Django中的orm。

小项目不扫何以扫寰宇
运用Django+Xadmin营造在线教育平台

原生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中注册

因此留言版功能回看django基本功知识

课程中本章对应上传的仓库为:
https://github.com/mtianyan/DjangoGetStarted

对应首先次commit:留言板酒馆开始化。内容甘休3-1朝气蓬勃章结束。

  • 将对于django目录构造,使用Django快捷搭建能够交给的表单页面,models.py
    , urls.py, views.py。
  • 从数据库中抽出数据显示到html中:Django Template的布局。
  • 即django的基本功知识通过那个留言板项目进展一个宏观细致的上学。

在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作为主键。

3-1 django目录布局

django目录:

projectname : 保存Django项目的urls,setting,uwsgi文件

正如图新建二个Django项目DjangoGetStarted,使用大家上章节中已存在的设想碰到DjangoTest
(里面早就装好了django卡塔尔(英语:State of Qatar)

mark

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',
)]

django自动生成的目录

领头化达成后的目录如下:(假设不是,那么你们可能创制的不是django项目卡塔尔(英语:State of Qatar)

mark

能够看看主目录DjangoGetStarted与项目目录DjangoGetStarted

  • DjangoGetStarted(文件夹):
    • setting.py: 项目全局配置文件
    • urls.py: 首要的urls配置入口
    • wsgi.py: 是Django运营须求的公文。
  • templates(文件夹): 放置html文件
  • manage.py:
    运行Django供给的严重性文件。(首要的Django命令都经过manage.py运维卡塔尔(英语:State of Qatar)

介绍字段参数

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业已成为大家的新主键。

还需求大家温馨创设的目录

app是Django里多个叁个使用的文本夹单位。

通过 Tools -> Run manage.py Task创建app:

mark

介绍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竣事。

startapp message

能够看出当输入startapp message之后,创建了message动用。并贮存在了:与项目目录同级目录。

mark

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

新建static目录

使用static目录来存放在网址的静态文件:js,css,图片等。

filter收取钦赐供给值

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

mark

依照下边调节和测量检验进度重新调试能够看看我们同样抽取了值。

小操练:将名字改为与友爱数据库存放值差异的。查看结果。

mark

化为了空驶列车表,表明全体准确。

新建log目录

应用log目录来寄存在网址的日志文件

将数据存入数据库

明白: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

新建media目录

利用media目录存放客商上传的图纸等财富。

Navicat进行表明

能够看出成功的增多了数据mtianyan2

mark

抽薪止沸项目大了后头app过多难题

  1. 新建文件夹 apps
  2. 将message文件夹拖入apps文件夹内:会自动生成__init__.py文本申明那是叁个包。使得apps文件夹可导入。

mark

那个时候大家就能够发今后导入我们的message的原委就得配置较长的门路。

mark

老是前面都得抬高apps.,那可烦死人呐。

一网打尽方案奉上

apps目录右键markSource Root(Mark方法查看第意气风发章pycharm简单利用:目录颜色各异的缘故卡塔尔国

mark

mark成功以往变蓝(变绿的话,只好摸摸头了,当然选拔原谅卡塔尔国,然后能够直接选拔短路线进行import

什么从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

Mark后Pycharm 不报错,Cmd下运转报错。

Mark后pycharm知道那是贰个项指标Souce Root路径了,但是cmd并不知道。

在项目目录下通过cmd命令行使用python manage.py runserver

mark

pycharm中mark只是pycharm本身能够举办分辨短路线。

缓和方案:

大家在setting文件中安顿大家的apps路径:

mark

图解读:大家需求在setting中向上海教室少年老成律设置,程序就能随着报错。(换了一个荒唐了,滑稽脸卡塔尔(قطر‎

import sys
sys.path.insert(0,os.path.join(BASE_DIR,'apps'))

上述代码为将apps拼接项目相对路线后的路子插入当前系统的遇到变量path中,那样就能够成功化解(个屁屁啊卡塔尔(قطر‎。

成功性测量检验(测量试验已倒闭卡塔尔:

本条import放到manage.py文件是那么些的 你把manage.py中那行删除
因为django整个的布署还尚未运行好 import django的model是可怜的,

插播:忘了停业呢,笔者偷学上边方法养你。

极限杀绝:将以此import措施比方urls.py.等可以成功运转。可能电动删除该import。

mark

乙巳革命警戒:

You have unapplied migrations; your app may not work properly 
until they are applied. Run 'python manage.py migrate' to apply them.

是因为大家从不举办数据库models進张开头化migrate.

python manage.py migrate大家以往会用到,今后绝不做。

数据库新扩展。

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

能够看来我们的数据库中早就新扩张,标识着我们已经成功存入数据。

github堆栈项目初叶化第三回commit。

mark

输入顾客名密码,点击login。

mark

分选左边导航中Git 设置你的git.exe的路径

mark

点击Share project on GitHub会弹出下图窗口

mark

填写您的类型名称描述。点击share

会弹窗让您筛选供给上传的品种文件与commit新闻。然后将品种上传至github。

自己教程中上传的饭店为:
https://github.com/mtianyan/DjangoGetStarted

对应首先次commit:留言板旅社最初化。内容甘休3-1生机勃勃章截止。

删去数据。

对此查询到的数据做去除:

# 方法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

ifequal & ifnotequal

mark

法定文书档案解释:ifequal a b
相当于f a == b.ifnotequal则一定于if a != b

村办施行:

mark

结果为:未找到普通话别名

slice

mark

法定文书档案解释:其实正是切成丝操作。从头开头切到第n个。

民用施行:

mark

本来mtianyanmtianyan1是差异的,不过切成块后前两个人相同。
运作结果显示 :对应中文昵称:天涯明月笙

UMuranol的别称设置才能

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