bg游戏资讯:小司机带你学,1在线教育零基础到

作者: 网页游戏资讯  发布:2019-05-27

3-3 django orm介绍与model设计

上节课程实现后代码(来上学本节前置条件):

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

  • 对应commit: 留言板前端页面显示。此次内容结束教程3-2终了。

也许未来你还在经过手写sql语句来操作数据库,当大家有了orm,数据库操作变得很简短。这一小节大家来学学Django中的orm。

小品种不扫何以扫寰宇
选拔Django Xadmin创设在线教育平台

示范地址: http://mxonline.mtianyan.cn

原生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()

bg游戏资讯:小司机带你学,1在线教育零基础到上线教程。同意能够让数据库字段的询问和应用类的一个属性一样简单?没错登登登:orm进场了

book:name

book.name
book.save()

Django的orm正是为着让大家不再写上边那样的口舌,而是像使操作数据库像使用类和类属性同样。

  • 其三章:通过留言板功效回想django基础知识
    通过做三个小留言板,学习django基础知识
    课程仓库地址壹: https://github.com/mtianyan/DjangoGetStarted

课程商旅地址一: https://github.com/mtianyan/DjangoGetStarted
课程宾馆地址二: https://github.com/mtianyan/Mxonline2
课程仓库地址三: https://github.com/mtianyan/Mxonline3

创制大家的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:留言板宾馆早先化。内容结束三-一壹章截至。

  • 将对此django目录结构,使用Django神速搭建能够提交的表单页面,models.py , urls.py, views.py。
  • 从数据库中抽取数据体现到html中:Django Template的安顿。
  • 即django的基础知识通过这些留言板项目张开二个周密细致的求学。

八-1 课程列表

bg游戏资讯:小司机带你学,1在线教育零基础到上线教程。拷贝课程列表页到template目录

创制课程有关的urls.py

Mxonline2/urls.py中宣示包括到course的url中:

    # 课程app的url配置
    url(r"^course/", include('courses.urls', namespace="course")),

django2.0.1版本:

    # 课程app的url配置
    path("course/", include('courses.urls', namespace="course")),

书写管理列表展现相关的view

courses/views.py

class CourseListView(View):
    def get(self, request):
        return render(request, "course-list.html", { })

courses/urls.py

# encoding: utf-8
from courses.views import CourseListView

__author__ = 'mtianyan'
__date__ = '2018/1/13 0013 00:39'

from django.conf.urls import url

urlpatterns = [
    # 课程列表url
    url(r'^list/$', CourseListView.as_view(), name="list"),

]

django2.0.1版本:

# encoding: utf-8
__author__ = 'mtianyan'
__date__ = '2018/1/13 0013 01:57'

# encoding: utf-8
from courses.views import CourseListView
from django.urls import path
app_name = "courses"
urlpatterns = [
    # 课程列表url
    path('list/', CourseListView.as_view(), name="list"),

]

那儿做客尚未样式。我们起先对于course list html进行职业
能够洞察到它和orglist同样能够有同步的头尾。所以持续base页面

xadmin中加多一些课程。

接下来在view中回到课程数据

class CourseListView(View):
    def get(self, request):
        all_course = Course.objects.all()
        return render(request, "course-list.html", {
            "all_course":all_course,

        })

bg游戏资讯 1

mark

保存三个div

bg游戏资讯 2

mark

bg游戏资讯:小司机带你学,1在线教育零基础到上线教程。经过外键字段取外键表中字段

在setting中登记我们的app

DjangoGetStarted/settings.py 大概36行INSTALLED_APPSbg游戏资讯:小司机带你学,1在线教育零基础到上线教程。:

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

那儿大家再一次启动Tools 菜单下 Run manage.py Task会提示:

万壹提醒:

SyntaxError: Non-ASCII character 'xe7' in file D:CodeSpacePythonProjectDjangoGetStartedappsmessagemodels.py on line

bg游戏资讯:小司机带你学,1在线教育零基础到上线教程。请留意只怕您忘掉在写过普通话的地方加上:

#coding: utf-8

留意必须加在第3或二行。

然后施行上面发号施令:

makemigrations message

mark

migrate message 生成数据表

mark

bg游戏资讯:小司机带你学,1在线教育零基础到上线教程。前往Navicat验证:

mark

能够看出我们的数据表已经创立成功。暗许数据表名字为app名称_类名转换为小写
自动生成的id作为主键。

三-一 django目录结构

django目录:

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

正如图新建贰个Django项目DjangoGetStarted,使用大家上章节中已存在的虚拟情况DjangoTest (里面已经装好了django)

mark

分页功用

拷贝代码:

from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
 # 对课程机构进行分页
        # 尝试获取前台get请求传递过来的page参数
        # 如果是不合法的配置参数默认返回第一页
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        # 这里指从allorg中取五个出来,每页显示5个
        p = Paginator(all_orgs, 4, request=request)
        orgs = p.page(page)

转移完毕:

class CourseListView(View):
    def get(self, request):
        all_course = Course.objects.all()
        # 对课程进行分页
        # 尝试获取前台get请求传递过来的page参数
        # 如果是不合法的配置参数默认返回第一页
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        # 这里指从allorg中取五个出来,每页显示5个
        p = Paginator(all_course,6 , request=request)
        courses = p.page(page)
        return render(request, "course-list.html", {
            "all_course":courses,

        })

在html中使用时只顾object_list

此时的all_course已经不是多少个queryset,而是四个purepage对象。

bg游戏资讯 3

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项目)

mark

能够观看主目录DjangoGetStarted与品种目录DjangoGetStarted

  • DjangoGetStarted(文件夹):
    • setting.py: 项目全局配置文件
    • urls.py: 主要的urls配置入口
    • wsgi.py: 是Django运营要求的文本。
  • templates(文件夹): 放置html文件
  • manage.py: 运转Django供给的第三文件。(重要的Django命令都因此manage.py运维)

对于页码实行修改

bg游戏资讯 4

mark

间接把orglist中的这段拿过来就行了。自行替换变量名称

此刻曾经好了。

介绍字段参数

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里2个一个利用的文书夹单位。

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

mark

排序功效

将事先的sort逻辑拷贝过来:

# 进行排序
        sort = request.GET.get('sort', "")
        if sort:
            if sort == "students":
                all_orgs = all_orgs.order_by("-students")
            elif sort == "courses":
                all_orgs = all_orgs.order_by("-course_nums")

修改形成:

        # 进行排序
        sort = request.GET.get('sort', "")
        if sort:
            if sort == "students":
                all_course = all_course.order_by("-students")
            elif sort == "hot":
                all_course = all_course.order_by("-click_nums")

应放在分页在此之前。让分页管理全体筛选过的数码

return render时添加

            "sort":sort,

用来判断激活状态。

bg游戏资讯 5

mark

bg游戏资讯 6

mark

修改a标签参数

    # 热门课程推荐
        hot_courses = Course.objects.all().order_by("-students")[:3]
        return render
         "hot_courses":hot_courses

修改html中

bg游戏资讯 7

mark

for循环填充内容

bg游戏资讯 8

mark

那边的degree我们在数据库中填入的是字母。怎么着展现为华语。

  • 私家预计: template if

get_degree_display degree是字段名。特地用于choice字段显示

本小节完成对应commit:

八-壹实现课程列表页呈现,分页,火爆课程。

介绍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映射成表达成。内容截止教程三-三甘休。

startapp message

能够看来当输入startapp message之后,创建了message运用。并存放在了:与品类目录同级目录。

mark

八-二 课程详细情况页1

拷贝course_detail进入template目录

能够看来那些页面也是继续base页面包车型大巴。将course_list的页面框架拿过来

轮换面包屑。

bg游戏资讯 9

mark

配置url访问

django2.0.1:

    # 课程详情页
    re_path('course/(?P<course_id>d )/', CourseDetailView.as_view(), name="course_detail"),

书写对应访问的view

 课程详情处理view

class CourseDetailView(View):
    def get(self, request, course_id):
        return  render(request, "course-detail.html", {

        })

品味访问:

在列表体现页放入详细情形的url。

bg游戏资讯 10

mark

有参数类型的把参数也传进来

进行数据填充:先收取当前的科目

        # 此处的id为表默认为我们添加的值。
        course = Course.objects.get(id = int(course_id))

                return  render(request, "course-detail.html", {
            "course":course,
        })

html中抽取数据:

bg游戏资讯 11

mark

学科的章节数如何完结?

models.py中自定义方法

    def get_zj_nums(self):
        # 获取课程章节数的方法
        return self.lesson_set.all().count()

增多课程体系字段

    category = models.CharField(max_length=20, default=u"", verbose_name=u"课程类别")

makemigrations
migrate

operation中非常有张表是做用户学习记录的。

UserCourse查询有怎么着学生学习了那门课

    # 获取学习这门课程的用户
    def get_learn_users(self):
        # 谁的里面添加了它做外键,他都可以取出来
        return self.usercourse_set.all()[:5]

bg游戏资讯 12

mark

链式调用抽取数据

增添一些用户课程实行验证

bg游戏资讯 13

mark

能够见见已经马到成功

学科详细情况的view中增多clicknums 一

        # 增加课程点击数
        course.click_nums  = 1
        course.save()

bg游戏资讯 14

mark

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

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

  • 上小节达成代码对应commit: 留言板数据库orm映射成表完结。内容截至教程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.能够见见那是2个{QuerySet}类型的对象,里面存放着[<UserMessage: UserMessage object>]

  • f6使运转到下一步。此时下方的值窗口内能够看出message的值。表明大家中标取到了数据库的值。

mark

新建static目录

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

8-三 课程详细的情况页二

bg游戏资讯 15

mark

tab_cont一 中填充大家本身的内容。

bg游戏资讯 16

mark

教员数自定义函数

def get_teacher_nums:
    return self.teacher_set.all().count

不用自定义函数的措施如下

bg游戏资讯 17

mark

filter抽取钦点需要值

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

mark

遵循上边调节和测试进度重新调节和测试能够阅览我们一样抽出了值。

小演习:将名字改为与自身数据仓库储存放值差异的。查看结果。

mark

形成了空驶列车表,表明一(Wissu)切准确。

新建log目录

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

学科是还是不是相关

概念课程的tag ,假诺tag同样,那么是不毫不相关系学科。

courses/models.py:

    tag = models.CharField(max_length=15, verbose_name=u"课程标签", default=u"")

更换数据库后决然。此处略。

 tag = course.tag
        if tag:
        # 需要从1开始不然会推荐自己
            relate_courses = Course.objects.filter(tag=tag)[1:2]
        else:
            relate_courses = []

return render加上:

            "relate_courses":relate_courses,

本文由bg游戏资讯发布于网页游戏资讯,转载请注明出处:bg游戏资讯:小司机带你学,1在线教育零基础到

关键词: 网站开发

上一篇:产品新人吐槽记,该何去何从
下一篇:没有了