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

可以能够让数据库字段的查询和利用类的二个属性同样轻易?没有错登登登:orm进场了

book:name

book.name
book.save()

Django的orm就是为了让大家不再写上面那样的话语,而是像使操作数据库像使用类和类属性同样。

课程仓库地址1:
https://github.com/mtianyan/DjangoGetStarted
课程仓库地址2:
https://github.com/mtianyan/Mxonline2
课程宾馆地址3:
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:留言板货仓伊始化。内容结束3-1意气风发章截止。

  • 将对此django目录结构,使用Django急迅搭建能够付出的表单页面,models.py
    , urls.py, views.py。
  • 从数据库中收取数据呈现到html中:Django Template的配备。
  • 即django的基础知识通过这些留言板项目进展一个到家稳重的就学。

8-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,

        })

必赢网站 1

mark

封存二个div

必赢网站 2

mark

透过外键字段取外键表中字段

在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)

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对象。

必赢网站 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运转)

对于页码进行修正

必赢网站 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里一个三个应用的公文夹单位。

通过 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,

用来剖断激活状态。

必赢网站 5

mark

必赢网站 6

mark

改进a标签参数

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

修改html中

必赢网站 7

mark

for循环填充内容

必赢网站 8

mark

那边的degree大家在数据库中填入的是字母。怎么着展现为汉语。

  • 私家估摸: template if

get_degree_display degree是字段名。特意用于choice字段彰显

本小节完成对应commit:

8-1落成课程列表页呈现,分页,紧俏课程。

介绍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

8-2 课程详细情况页1

拷贝course_detail进入template目录

能够看到那个页面也是一而再再而三base页面包车型大巴。将course_list的页面框架拿过来

轮换面包屑。

必赢网站 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。

必赢网站 10

mark

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

进展数据填充:先抽出当前的课程

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

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

html中收取数据:

必赢网站 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]

必赢网站 12

mark

链式调用抽取数据

丰盛一些客商课程进行说明

必赢网站 13

mark

能够看来已经大功告成

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

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

必赢网站 14

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,图片等。

8-3 课程实际情况页2

必赢网站 15

mark

tab_cont1 中填充大家和谐的开始和结果。

必赢网站 16

mark

教员职员和工人数自定义函数

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

不用自定义函数的点子如下

必赢网站 17

mark

filter收取钦赐必要值

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

mark

根据地点调节和测验进程重新调节和测量试验能够看来大家同样抽出了值。

小练习:将名字改为与谐和数据库存放值不一致的。查看结果。

mark

产生了空驶列车表,表达全部正确。

新建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,

将数据存入数据库

叩问: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目录贮存客户上传的图形等能源。

珍藏功用:

将block js写到页面尾部。

<script type="text/javascript">
//收藏分享
function add_fav(current_elem, fav_id, fav_type){
    $.ajax({
        cache: false,
        type: "POST",
        url:"{% url "org:add_fav" %}",
        data:{'fav_id':fav_id, 'fav_type':fav_type},
        async: true,
        beforeSend:function(xhr, settings){
            xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
        },
        success: function(data) {
            if(data.status == 'fail'){
                if(data.msg == '用户未登录'){
                    window.location.href="/login/";
                }else{
                    alert(data.msg)
                }

            }else if(data.status == 'success'){
                current_elem.text(data.msg)
            }
        },
    });
}

$('#jsLeftBtn').on('click', function(){
    add_fav($(this), {{ course.id }}, 1);
});

$('#jsRightBtn').on('click', function(){
    add_fav($(this), {{ course.course_org.id }}, 2);
});


</script>

刷新后又不见了的主题材料,从view中传递has_fav的参数。前台举办决断。

  # 是否收藏课程
        has_fav_course = False
        has_fav_org = False

        # 必须是用户已登录我们才需要判断。
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1):
                has_fav_course = True
            if UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2):
                has_fav_org = True

return render

            "has_fav_course":has_fav_course,
            "has_fav_org":has_fav_org,

html中使用;

必赢网站 18

mark

必赢网站 19

mark

8-2&3成就课程详情页显示,课程详细情况页机构,相关推荐课程。收藏课程,收藏单位。

Navicat举办认证

能够看见成功的增加了数码mtianyan2

mark

解决项目大了后来app过多难点

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

mark

当时我们就能够意识在导入大家的message的内容就得配置较长的门路。

mark

每回前边都得抬高apps.,那可烦死人呐。

斩草除根方案奉上

apps目录右键markSource Root(马克方法查看第风姿洒脱章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

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

马克后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是不一致的,但是切丝后前柒位相仿。
运维结果呈现 :对应中文昵称:天涯明月笙

USportagel的小名设置技术

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

相关文章