壹在线教育零基础到上线教程,小司机带你学

原生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就是为了让大家不再写上边那样的话语,而是像使操作数据库像使用类和类属性一样。

宏观大家的view

将列表里的静态数据变成后台获取的动态数据

organization/views.py

from .models import CourseOrg, CityDict


class OrgView(View):
    def get(self,request):
        # 查找到所有的课程机构
        all_orgs = CourseOrg.objects.all()
        # 取出所有的城市
        all_citys = CityDict.objects.all()

        return render(request, "org-list.html", {
            "all_orgs":all_orgs,
            "all_citys": all_citys,
        })

在前端页面中放入值。

为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

中标!!大家曾经将后台数据库数据成功呈现到前台。

github饭店项目伊始化第三次commit。

mark

输入用户名密码,点击login。

mark

选料左边导航中Git 设置你的git.exe的门路

mark

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

mark

填写您的项目名称描述。点击share

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

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

对应首先次commit:留言板旅馆初阶化。内容甘休3-11章甘休。

7-叁 课程机构列表页数据展现1

分明由后台传过来的动态数据:

授课机构列表本人, 授课机构的排名,所在地点(后台收取全数地点),
机构系列写成静态,因为一般不怎么变动。

在xadmin中增加城市消息,课程新闻。

丰裕都会

图片 1

mark

累加单位。

插播知识点:

图片 2

mark

那边钦命的路子是一个相对路线

setting中要安排大家把文件存放在哪些根目录之下

# 设置我们上传文件的路径

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

在项目根目录成立media文件夹

在后台上传图片

图片 3

mark

图片 4

mark

修改机构消息中封面图为logo

自行增添十一个科目机构

U宝马7系l的外号设置技术

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/$'没有供给再修改前端代码中值。

马克后Pycharm 不报错,Cmd下运营报错。

马克后pycharm知道那是2个类型的Souce Root路线了,但是cmd并不知道。

在档案的次序目录下通过cmd命令行使用python manage.py runserver

mark

pycharm中mark只是pycharm自个儿能够展开鉴定识别短路线。

消除方案:

笔者们在setting文件中布局我们的apps路径:

mark

图解读:大家须求在setting中向上海体育场所一律设置,程序就能够随着报错。(换了2个不当了,好笑脸)

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咱俩随后会用到,今后毫无做。

Django template 共用尾部底部机制

将head和foot放在多少个html中,然后在写其余急需那三个部分的页面时include进来。

Django也是援助include机制的。

在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

只顾必须加在第二或2行。

接下来施行上边发号施令:

makemigrations message

mark

migrate message 生成数据表

mark

前往Navicat验证:

mark

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

新建log目录

使用log目录来存放在网址的日记文件

include的问题

include的进去的死页面,那时候该怎么做?

化解那种难题:进行模板的接续机制。定义多个父类的框架,子类可以轮换在那之中一些block,子类只须求重写本身索要转移的block。

介绍Meta信息:

Meta音讯中大家得以钦定常见的类别:

db_table = "user_meassage"

自定义后生成表,表名会与大家的保持1致。而不会前缀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映射成表实现。内容停止教程三-三扫尾。

新建media目录

行使media目录存放用户上传的图片等财富。

课程旅舍地址一:
https://github.com/mtianyan/DjangoGetStarted
课程客栈地址二:
https://github.com/mtianyan/Mxonline2
课程货仓地址三:
https://github.com/mtianyan/Mxonline3

filter收取内定需要值

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

mark

坚守地点调试进度重新调节和测试能够看来大家一样抽取了值。

小演练:将名字改为与友好数据仓库储存放值不一样的。查看结果。

mark

改为了空驶列车表,表达全部正确。

三-一 django目录结构

django目录:

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

一般来讲图新建多少个Django项目DjangoGetStarted,使用大家上章节中已存在的虚拟遇到DjangoTest
(里面已经装好了django)

mark

7-1 django templates模板承袭1

  • 部门得以筛选体系
  • 机构得以依据各省地方进行分类

左侧小编要上学效果: form表单提交
右下:授课机构排名

页面底部与后面部分为大局头和大局尾巴部分。

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

消除项目大了随后app过多难题

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

mark

那儿大家就能意识在导入我们的message的始末就得配置较长的门路。

mark

老是前边都得加上apps.,那可烦死人呀。

消除方案奉上

apps目录右键markSource Root(Mark方法查看第三章pycharm轻易利用:目录颜色各异的因由)

mark

mark成功之后变蓝(变绿的话,只好摸摸头了,当然选拔原谅),然后能够直接行使短路线进行import

7-2 开始orglist编写

首先步:清空全部剧情

  • 继承base页面

图片 5

mark

  • 覆盖父类的title

图片 6

mark

  • 挥洒课程机构view
    organization/views.py

# encoding: utf-8
from django.views.generic.base import View
# 处理课程机构列表的view
class OrgView(View):
    def get(self,request):
        return render(request, "org-list.html", { })
  • Django2.0.一配置课程机构首页url

    # 课程机构首页url
    path('org_list/', OrgView.as_view(), name="org_list"),
  • Django1.9.8配置url:

    # 课程机构首页url
    url(r'^org_list/$', OrgView.as_view(), name="org_list"),
slice

mark

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

私家实施:

mark

本来mtianyanmtianyan1是见仁见智的,不过切块后前7个人一样。
运行结果展现 :对应中文昵称:天涯明月笙

小品种不扫何以扫寰宇
采纳Django+Xadmin创设在线教育平台

template中新建base.html

将课程机构列表页。orglist拷贝进template目录

将orglist内容替换base内容。

图片 7

mark

将div收起来

图片 8

mark

loadstaticfiles & 修改静态文件路线为static

那一个手续做过太多遍了,自行实现。耐心就行了。

三-4 django model的增加和删除改

github酒店地址:https://github.com/mtianyan/DjangoGetStarted

  • 上小节实当代码对应commit:
    留言板数据库orm映射成表落成。内容停止教程三-三截止。

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

还亟需大家团结创设的目录

app是Django里1个一个用到的公文夹单位。

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

mark

修改面包屑

  • base中只保留首页

  • org中重写block custom_bread

  • block之间从未先后顺序。

  • 将base中block content拿到orglist重写

图片 9

mark

  • 然后将base中block中间section删除掉

图片 10

mark

orglist开始loadstaticfiles

ctrl+d快快删除

图片 11

mark

页面包车型客车存续关系使得变量也足以直接用

举例user中的form数据传递到register文件当中.要是register承接的是base页面。
base页面个中也是能够用那几个数据的。参数的向上传递

每一种request对象都会传送到html中来,假使持续了base,request也会向上传递到base。
base中就足以参加大家的逻辑: 用户是不是登入等。

小节竣事对应commit:

做到Django templates的继续关系领悟,机构列表展示页。对应7-一 & 2

template模板渲染中的一些用法。

在我们的template模板中也正是form.html中,不允许大家写Python的语法,
它提供了一套自身的内建标签。

官方文书档案中template内建标签用法传送门

django自动生成的目录

起首化达成后的目录如下:(要是否,那么你们恐怕创制的不是django项目)

mark

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

  • DjangoGetStarted(文件夹):
    • setting.py: 项目全局配置文件
    • urls.py: 主要的urls配置入口
    • wsgi.py: 是Django运维需求的文本。
  • templates(文件夹): 放置html文件
  • manage.py:
    运转Django必要的机要文件。(主要的Django命令都经过manage.py运转)

概念父模板: 包蕴head & footer

title应该是能够被子页面替换的之所以要包起来。

图片 12

mark

css有共用的有的,也有可以被子页面替换的有的。

图片 13

mark

js同理

图片 14

mark

面包屑是急需被依次页面自个儿替换的。

图片 15

mark

将正文内容包起来;

图片 16

mark

那时候base页面就塑造好了

将数据存入数据库

摸底: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

  • 直白牵挂f陆单步调节和测试,直到如下图:孔雀蓝到return语句

mark

能够在下方值窗口查看到值

mark

新建static目录

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

以身作则地址:
http://mxonline.mtianyan.cn

3-3 django orm介绍与model设计

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

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

  • 对应commit: 留言板前端页面呈现。本次内容甘休教程3-二了结。

或许未来您还在经过手写sql语句来操作数据库,当大家有了orm,数据库操作变得很轻易。这一小节大家来读书Django中的orm。

通过留言版功效回看django基础知识

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

对应率先次commit:留言板旅社开端化。内容停止三-1一章截至。

  • 将对此django目录结构,使用Django快速搭建可以付出的表单页面,models.py
    , urls.py, views.py。
  • 从数据库中抽取数据展示到html中:Django Template的安顿。
  • 即django的基础知识通过那一个留言板项目进展一个宏观细致的读书。

models中增多机构类别

organization/models.py:

class CourseOrg(models.Model):
    ORG_CHOICES =(
        ("pxjg", u"培训机构"),
        ("gx", u"高校"),
        ("gr", u"个人"),
    )

    name = models.CharField(max_length=50, verbose_name=u"机构名称")
    # 机构描述,后面会替换为富文本展示
    desc = models.TextField(verbose_name=u"机构描述")
    # 机构类别:
    category = models.CharField(max_length=20, choices=ORG_CHOICES, verbose_name=u"机构类别", default="pxjg")

修改了models之后做数据库的更改:

makemigrations organization
migrate organization

图片 17

mark

姣好现在展开Navicat进行验证:

图片 18

mark

能够见到新增加了。

Navicat举办验证

能够看看成功的增加了数据mtianyan2

mark

startapp message

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

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

可以观察我们的数据库中已经新扩张,标记着我们已经成功存入数据。

修改return render

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

此间前边的”my_meassage”是大家得以活动命名的。会有2个my_message目的随器重临前端页面。

ifequal & ifnotequal

mark

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

民用实施:

mark

结果为:未找到汉语别名

介绍字段参数

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早已成为我们的新主键。

删除数据。

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

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

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: 留言板项目学习完毕,这一次内容停止教程三-5。完毕,撒花。
项目Github地址:https://github.com/mtianyan/DjangoGetStarted

如何从html的提交中取到数据并保留进数据库

templates/message_form.html:

mark

method是post。action就是指向我们在urls.py中配备的/form/
眼下必须加斜杠指根路线下form
当中的input会自动把值传递给后台:那时大家就能够在getform中取到刚才传递过来的值。

运维品种:然后输入要求填写的值。点击提交:出现40三漏洞非常多

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

成立大家的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中注册

3-5 django url templates配置

项目Github地址:https://github.com/mtianyan/DjangoGetStarted
本节起来对应相应Github的commit:django
model的增删改数据库。本次内容停止教程叁-四。

本节将介绍url的安插,以及怎么样将数据库数据填充回前台html页面。

情景:只同意用户修改mtianyan,假使未有就拉长,假诺有就装满使用户能够修改。

将数据回填至html中

if - else

法定提供模板如下:

mark

民用实践:

mark

满足if运维结果:

mark

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

mark

抽出数据

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]

这里注意把前几节写的去除掉

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

相关文章