精华内容
下载资源
问答
  • 最简单的 Django 教程

    2021-07-28 00:17:47
    一、Django简介1. web框架介绍具体介绍Django之前,必须先介绍WEB框架等概念。web框架:别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己...

    一、Django简介

    1. web框架介绍

    具体介绍Django之前,必须先介绍WEB框架等概念。

    web框架:别人已经设定好的一个web网站模板,你学习它的规则,然后“填空”或“修改”成你自己需要的样子。

    一般web框架的架构是这样的:

    其它基于python的web框架,如tornado、flask、webpy都是在这个范围内进行增删裁剪的。例如tornado用的是自己的异步非阻塞“wsgi”,flask则只提供了最精简和基本的框架。Django则是直接使用了WSGI,并实现了大部分功能。

    2. MVC/MTV介绍

    MVC百度百科:全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

    通俗解释:一种文件的组织和管理形式!不要被缩写吓到了,这其实就是把不同类型的文件放到不同的目录下的一种方法,然后取了个高大上的名字。当然,它带来的好处有很多,比如前后端分离,松耦合等等,就不详细说明了。

    模型(model):定义数据库相关的内容,一般放在models.py文件中。

    视图(view):定义HTML等静态网页文件相关,也就是那些html、css、js等前端的东西。

    控制器(controller):定义业务逻辑相关,就是你的主要代码。

    MTV: 有些WEB框架觉得MVC的字面意思很别扭,就给它改了一下。view不再是HTML相关,而是主业务逻辑了,相当于控制器。html被放在Templates中,称作模板,于是MVC就变成了MTV。这其实就是一个文字游戏,和MVC本质上是一样的,换了个名字和叫法而已,换汤不换药。

    3.Django的MTV模型组织

    目录分开,就必须有机制将他们在内里进行耦合。在Django中,urls、orm、static、settings等起着重要的作用。一个典型的业务流程是如下图所示:

    二、Django项目实例

    1. 程序安装

    python3.5、pip3及pycharm专业版自行安装。pycharm不要使用免费版,它不支持Django。

    (1)安装Django:

    http://www.cnblogs.com/qianyuliang/p/6729298.html

    2. 创建django项目

    在linux等命令行界面下,使用django提供的命令和vim也能进行项目开发。但是,这里使用eclipse

    点击:file-->project,出现下面的对话框。

    选择PyDev/Django栏目,输入项目名称,这里采用国际惯例的mysite。

    然后一直next就可以了

    Django将自动生成下面的目录结构:

    与项目同名的目录中是配置文件,templates目录是html文件存放也就是MTV中的T(手动新建)。manage.py是django项目管理文件。

    1. 创建APP

    在每个django项目中可以包含多个APP,相当于一个大型项目中的分系统、子模块、功能部件等等,相互之间比较独立,但也有联系。

    所有的APP共享项目资源。

    右键点击mysite--->Django--->Create application

    这样就创建了一个叫做app01的APP,django自动生成“app01”文件夹。

    1. 编写路由

    路由都在urls文件里,它将浏览器输入的url映射到相应的业务处理逻辑。

    简单的urls编写方法如下图:

    1. 编写业务处理逻辑

    业务处理逻辑都在views.py文件里。

    通过上面两个步骤,我们将index这个url指向了views里的index()函数,它接收用户请求,并返回一个“hello world”字符串。

    1. 运行web服务

    现在我们已经可以将web服务运行起来了。

    记得将app01写入到settings.py中

    命令行的方式是:python manage.py runserver 127.0.0.1:8000

    在eclipse中--->run configurations

    有这个提示,则表示启动成功,然后打开浏览器,输入127.0.0.1:8000

    修改一下url,添加“/index”,就一切ok了!

    至此,一个最简单的django编写的web服务就启动成功了。

    1. 返回HTML文件

    上面我们返回给用户浏览器的是什么?一个字符串!实际上这肯定不行,通常我们都是将html文件返回给用户。

    下面,我们写这么一个index.html文件:

    再修改一下views文件:

    为了让django知道我们的html文件在哪里,需要修改settings文件的相应内容。但默认情况下,它正好适用,你无需修改。

    接下来,我们可以重新启动web服务。在浏览器刷新一下,你会看到带有样式的“hello world”。

    1. 使用静态文件

    我们已经可以将html文件返还给用户了,但是还不够,前端三大块,html、css、js还有各种插件,它们齐全才是一个完整

    的页面。在django中,一般将静态文件放在static目录中。接下来,在mysite中新建个static目录。

    你的CSS,JS和各种插件都可以放置在这个目录里。

    为了让django找到这个目录,依然需要对settings进行配置:

    同样,在index.html文件中,可以引入js文件了:

    重新启动web服务,刷新浏览器,查看结果。

    1. 接收用户发送的数据

    上面,我们将一个要素齐全的html文件返还给了用户浏览器。但这还不够,因为web服务器和用户之间没有动态交互。

    下面我们设计一个表单,让用户输入用户名和密码,提交给index这个url,服务器将接收到这些数据。

    先修改index.html文件

    然后修改views.py文件

    此时 ,重启web服务时,会出错,因为django有一个跨站请求保护机制,我们在settings文件中将它关闭。

    再次进入浏览器,刷新页面:

    输入点东西,然后我们在eclipse中可以看到相应的数据。

    1. 返回动态页面

    我们收到了用户的数据,但返回给用户的依然是个静态页面,通常我们会根据用户的数据,进行处理后在返回给用户。

    这时候,django采用jinja2语言编写动态模板,jinja2会根据提供的数据,替换掉html中的相应部分,详细语法入门后再深入学习。

    先改造views.py文件:

    再改造index.html文件:

    重启服务,刷新浏览器:

    可以看到,我们获得了用户实时输入的数据,并将它实时展示在了用户页面上,这是个不错的交互过程。

    1. 使用数据库

    流程走到这里,django的MTV框架基本已经浮出水面了,只剩下最后的数据库部分了。

    上面我们虽然和用户交互得很好,但并没有保存任何数据,页面一旦关闭,或服务器重启,一切都将回到原始状态。

    使用数据库是毫无疑问的,下面使用mysql数据

    在settings中,配置数据库相关的参数,如果使用自带的sqlite,不需要修改。然后在mysql数据库创建mysite库

    再编辑models.py文件,也就是MTV中的M。

    这里我们创建了2个字段,分别保存用户的名字和密码。

    接下来要在后台中通过命令创建数据库的表了。有2条命令,分别是:

    python manage.py makemigrations

    再输入命令:python manage.py migrate

    或者在eclipse中,右键点击mysite--->django--->makemigrations

    然后右键点击mysite--->django--->migrate

    修改views.py中的业务逻辑

    重启web服务后,刷新浏览器页面,之后和用户交互的数据都能保存到数据库中。任何时候都可以从数据库中读取数据,展示到页面上。

    至此,一个要素齐全,主体框架展示清晰的django项目完成了,其实很简单是不是?

    三、 Django总结

    作为python必须web框架的Django,它的功能强大,内容全面,但同时也意味着限制颇多,灵活性低,可修改性差,这就是鱼和熊掌不可兼得了。

    我们学习Django,其实就是学习一个软件,要理解它的基本原理,把握它整体框架,牢记一些基本规则,剩下的就是不断深入细节,然后熟能生巧、经验多少的问题了,不存在多高深的不可掌握技术。

    福利

    入门Python的最强三件套《ThinkPython》、《简明Python教程》、《Python进阶》的PDF电子版已打包提供给大家,关注下方公众号,在后台回复关键字P3」即可获取。

    推荐阅读:入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|年度爆款文案1).卧槽!Pdf转Word用Python轻松搞定!2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 4).80行代码!用Python做一个哆来A梦分身 5).你必须掌握的20个python代码,短小精悍,用处无穷 6).30个Python奇淫技巧集 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 8).再见Python!我要学Go了!2500字深度分析!9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片点阅读原文,领廖雪峰视频资料!
    
    展开全文
  • 目录:1.Form 基本使用django中的Form组件有以下几个功能:生成HTML标签验证用户数据(显示错误信息)HTML Form提交保留上次提交数据初始化页面显示内容2.Form中字段及...1.Django内置字段如下:Field:required=True, ...

    目录:

    1.Form 基本使用

    django中的Form组件有以下几个功能:

    生成HTML标签

    验证用户数据(显示错误信息)

    HTML Form提交保留上次提交数据

    初始化页面显示内容

    2.Form中字段及插件

    创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;

    1.Django内置字段如下:

    Field:

    required=True, 是否允许为空

    widget=None, HTML插件

    label=None, 用于生成Label标签或显示内容

    initial=None, 初始值

    help_text='', 帮助信息(在标签旁边显示)

    error_messages=None, 错误信息 {'required': '不能为空', 'invalid': '格式错误'}

    show_hidden_initial=False, 是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)

    validators=[], 自定义验证规则

    localize=False, 是否支持本地化(根据不同语言地区访问用户显示不同语言)

    disabled=False, 是否可以编辑

    label_suffix=None Label内容后缀

    CharField(Field)

    max_length=None, 最大长度

    min_length=None, 最小长度

    strip=True 是否移除用户输入空白

    IntegerField(Field), FloatField(IntegerField)

    max_value=None, 最大值

    min_value=None, 最小值

    DecimalField(IntegerField) 小数,举例,涉及金钱计算保留小数点后两位

    max_value=None, 最大值

    min_value=None, 最小值

    max_digits=None, 总长度

    decimal_places=None, 小数位长度

    BaseTemporalField(Field)

    input_formats=None 时间格式化

    DateField(BaseTemporalField) 格式:2015-09-01

    TimeField(BaseTemporalField) 格式:11:12

    DateTimeField(BaseTemporalField)格式:2015-09-01 11:12

    DurationField(Field) 时间间隔:%d %H:%M:%S.%f

    RegexField(CharField)

    regex, 自定制正则表达式

    max_length=None, 最大长度

    min_length=None, 最小长度

    error_message=None, 忽略,错误信息使用 error_messages={'invalid': '...'}

    EmailField(CharField) ...

    FileField(Field)

    allow_empty_file=False 是否允许空文件

    ImageField(FileField)

    ...

    注:需要PIL模块,pip install Pillow

    以上两个字典使用时,需要注意两点:

    - form表单中 enctype="multipart/form-data"

    - view函数中 obj = MyForm(request.POST, request.FILES)

    URLField(Field)...

    BooleanField(Field)...

    NullBooleanField(BooleanField)...

    ChoiceField(Field)

    choices=(), 选项,如:choices = ((0,'上海'),(1,'北京'),)

    required=True, 是否必填

    widget=None, 插件,默认select插件

    label=None, Label内容

    initial=None, 初始值

    help_text='', 帮助提示

    TypedChoiceField(ChoiceField)

    coerce = lambda val: val 对选中的值进行一次转换,通过lambda函数实现

    empty_value= '' 空值的默认值

    MultipleChoiceField(ChoiceField)多选框...

    TypedMultipleChoiceField(MultipleChoiceField)

    coerce = lambda val: val 对选中的每一个值进行一次转换

    empty_value= '' 空值的默认值

    ComboField(Field)

    fields=() 使用多个验证,如下:即验证最大长度20,又验证邮箱格式

    fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])

    MultiValueField(Field): 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用,提供接口,需要自己实现

    SplitDateTimeField(MultiValueField)

    input_date_formats=None, 格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']

    input_time_formats=None 格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']

    FilePathField(ChoiceField) 文件选项,目录下文件显示在页面中

    path, 文件夹路径

    match=None, 正则匹配

    recursive=False, 递归下面的文件夹

    allow_files=True, 允许文件

    allow_folders=False, 允许文件夹

    required=True,

    widget=None,

    label=None,

    initial=None,

    help_text=''

    GenericIPAddressField

    protocol='both', both,ipv4,ipv6支持的IP格式

    unpack_ipv4=False 解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用

    SlugField(CharField) :数字,字母,下划线,减号(连字符)

    UUIDField(CharField) :uuid类型

    import uuid

    # make a UUID based on the host ID and current time

    >>> uuid.uuid1() # doctest: +SKIP

    UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')

    # make a UUID using an MD5 hash of a namespace UUID and a name

    >>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')

    UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')

    # make a random UUID

    >>> uuid.uuid4() # doctest: +SKIP

    UUID('16fd2706-8baf-433b-82eb-8c7fada847da')

    # make a UUID using a SHA-1 hash of a namespace UUID and a name

    >>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')

    UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')

    # make a UUID from a string of hex digits (braces and hyphens ignored)

    >>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')

    # convert a UUID to a string of hex digits in standard form

    >>> str(x)

    '00010203-0405-0607-0809-0a0b0c0d0e0f'

    # get the raw 16 bytes of the UUID

    >>> x.bytes

    b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'

    # make a UUID from a 16-byte string

    >>> uuid.UUID(bytes=x.bytes)

    UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')

    Django内置插件:

    TextInput(Input) #input type="text"

    NumberInput(TextInput) # 数字输入框

    EmailInput(TextInput) # 邮箱输入框

    URLInput(TextInput) # url输入框

    PasswordInput(TextInput) # 密码输入框

    HiddenInput(TextInput) # 隐藏输入框

    Textarea(Widget) # textarea文本区

    DateInput(DateTimeBaseInput) # 日期输入框

    DateTimeInput(DateTimeBaseInput) # 日期时间输入框

    TimeInput(DateTimeBaseInput) # 时间输入框

    CheckboxInput # 多选框

    Select # 下拉框

    NullBooleanSelect # 非空布尔值下拉框

    SelectMultiple # 多选下拉框

    RadioSelect # 单选框

    CheckboxSelectMultiple # 多选checkbox ???

    FileInput # 文件上传

    ClearableFileInput

    MultipleHiddenInput # 多隐藏输入框

    SplitDateTimeWidget # 时间分割框(两个input框)

    SplitHiddenDateTimeWidget

    SelectDateWidget

    常用的选择插件

    # 单radio,值为字符串

    # user = fields.CharField(

    # initial=2,

    # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))

    # )

    # 单radio,值为字符串

    # user = fields.ChoiceField(

    # choices=((1, '上海'), (2, '北京'),),

    # initial=2,

    # widget=widgets.RadioSelect

    # )

    # 单select,值为字符串

    # user = fields.CharField(

    # initial=2,

    # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))

    # )

    # 单select,值为字符串

    # user = fields.ChoiceField(

    # choices=((1, '上海'), (2, '北京'),),

    # initial=2,

    # widget=widgets.Select

    # )

    # 多选select,值为列表

    # user = fields.MultipleChoiceField(

    # choices=((1,'上海'),(2,'北京'),),

    # initial=[1,],

    # widget=widgets.SelectMultiple

    # )

    # 单checkbox

    # user = fields.CharField(

    # widget=widgets.CheckboxInput()

    # )

    # 多选checkbox,值为列表

    # user = fields.MultipleChoiceField(

    # initial=[2, ],

    # choices=((1, '上海'), (2, '北京'),),

    # widget=widgets.CheckboxSelectMultiple

    # )

    Django模版加减乘除:

    Django模版加法:

    {{ value|add:10}}

    value=5,则返回15 Django模版减法:

    {{value|add:-10}}

    value=5,则返回-5,这个比较好理解,减法就是加一个负数 Django模版乘法:

    {% widthratio 5 1 100 %}

    上面的代码表示:5/1 *100,返回500,widthratio需要三个参数,它会使用 参数1/参数2*参数3,所以要进行乘法的话,就将参数2=1即可 Django模版除法

    view sourceprint?

    {% widthratio 5 100 1 %}

    上面的代码表示:5/100*1,返回0.05,只需要将第三个参数设置为1即可

    3.通过Django表单Form来完成需求

    1.根据用户填写表单的不同跳往不同的页面

    1.先创建app项目名:djangoform

    c4f1c25feb1c

    树形图

    2.app下创建文件夹djangoform,并建立表单form1.py

    # -*- coding:utf8 -*-

    from django.forms import Form

    from django.forms import widgets # 插件

    from django.forms import fields # 字段

    class webpage(Form):

    page = fields.CharField()

    3.app下创建templates文件夹,并创建不同的html网页

    index.html

    首页

    {% csrf_token %}

    请选择要进入的页面:{{ web.page }}

    page1.html

    page1

    Page1:一颦一笑一伤悲,一生痴迷一世醉.

    page2.html

    page2

    Page2:一嗟一叹一轮回,一寸相思一寸灰.

    其他几个网页类似

    4.建立视图views.py

    # -*- coding: utf-8 -*-

    from __future__ import unicode_literals

    from django.shortcuts import render,redirect

    from django.http import HttpResponse

    from djangoform import form1

    # Create your views here.

    def indexPage(request):

    if request.method == "GET":

    webPage=form1.webpage()

    return render(request,'index.html',{'web':webPage})

    elif request.method == "POST":

    webPage = form1.webpage(request.POST,request.FILES)

    if webPage.is_valid():

    values = webPage.clean()

    print(values)

    if values['page'] == '1':

    return render(request, 'page1.html', {'web': webPage})

    elif values['page']== '2':

    return render(request, 'page2.html', {'web': webPage})

    elif values['page']== '3':

    return render(request, 'page3.html', {'web': webPage})

    else:

    errors = webPage.errors

    print(errors)

    return render(request, 'index.html', {'web': webPage})

    else:

    return redirect('http://www.baidu.com')

    def index(request):

    if request.method == "GET":

    obj = forms.MyForm() # 没有值,在页面上渲染form中的标签

    return render(request, 'index.html', {'form': obj})

    elif request.method == "POST":

    obj = forms.MyForm(request.POST, request.FILES) # 将post提交过来的数据作为参数传递给自定义的Form类

    if obj.is_valid(): # obj.is_valid()返回一个bool值,如果检查通过返回True,否则返回False

    values = obj.clean() # 拿到处理后的所有数据,键值对的形式

    print(values)

    else:

    errors = obj.errors # 拿到未通过的错误信息,里面封装的都是对象

    print(errors)

    return render(request, 'index.html', {'form': obj})

    else:

    return redirect('http://www.baidu.com')

    5.定义视图函数相关的·urls.py·

    from django.conf.urls import include, url

    from django.contrib import admin

    from . import views

    urlpatterns = [

    url(r'^page/',views.indexPage,),

    ]

    6.把我们新定义的app加到settings.py中的INSTALL_APPS中和urls中,详情见Django教程(一)- Django视图与网址

    效果展示:

    c4f1c25feb1c

    首页index

    c4f1c25feb1c

    输入数字1跳转的页面

    c4f1c25feb1c

    输入数字2跳转的页面

    2.在网页上打印9*9乘法表

    home.html

    九九乘法表

    {% for i in list %}

    {% for j in list %}

    {% if j <= i %}

    {{i}}*{{j}}={% widthratio j 1 i %}

    {% endif %}

    {% endfor %}

    {% endfor %}

    views.py

    # -*- coding: utf-8 -*-

    from __future__ import unicode_literals

    from django.shortcuts import render

    # Create your views here.

    def home(request):

    list= [1,2,3,4,5,6,7,8,9,]

    return render(request,'home.html',{'list':list})

    urls.py

    from django.conf.urls import url

    from . import views

    urlpatterns=[

    url(r'^home/$',views.home,name='home',)

    ]

    效果展示:

    c4f1c25feb1c

    九九乘法表

    3.在网页上打印1-100之间的偶数

    先了解下python中map函数

    >>> map(str, range(5)) #对range(5)各项进行str操作

    ['0', '1', '2', '3', '4'] #返回列表

    >>> def add(n):return n+n

    ...

    >>> map(add, range(5)) #对range(5)各项进行add操作

    [0, 2, 4, 6, 8]

    >>> map(lambda x:x+x,range(5)) #lambda 函数,各项+本身

    [0, 2, 4, 6, 8]

    >>> map(lambda x:x+1,range(10)) #lambda 函数,各项+1

    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    >>> map(add,'zhoujy')

    ['zz', 'hh', 'oo', 'uu', 'jj', 'yy']

    #想要输入多个序列,需要支持多个参数的函数,注意的是各序列的长度必须一样,否则报错:

    >>> def add(x,y):return x+y

    ...

    >>> map(add,'zhoujy','Python')

    ['zP', 'hy', 'ot', 'uh', 'jo', 'yn']

    >>> def add(x,y,z):return x+y+z

    ...

    >>> map(add,'zhoujy','Python','test') #'test'的长度比其他2个小

    Traceback (most recent call last):

    File "", line 1, in

    TypeError: add() takes exactly 2 arguments (3 given)

    >>> map(add,'zhoujy','Python','testop')

    ['zPt', 'hye', 'ots', 'uht', 'joo', 'ynp']

    views.py

    # -*- coding: utf-8 -*-

    from __future__ import unicode_literals

    from django.shortcuts import render

    # Create your views here.

    def even(request):

    list = map(str,range(100)) #对range(100)各项进行str操作

    return render(request,'even.html',{'list':list})

    urls.py

    from django.conf.urls import url

    from . import views

    urlpatterns=[

    url(r'^even/$',views.even,name='even',)

    ]

    even.html

    1-100之间的偶数

    {% for item in list %}

    {% if forloop.counter|divisibleby:2 %}{{forloop.counter}} {% if not forloop.last %},{% endif %} {% endif %}

    {% endfor %}

    效果如下:

    c4f1c25feb1c

    在网页上打印1-100之间的偶数

    4.自定义验证验证规则

    方式1:在字段中自定义validators设计正则匹配

    from django.forms import Form

    from django.forms import widgets

    from django.forms import fields

    from django.core.validators import RegexValidator

    class MyForm(Form):

    user = fields.CharField(

    validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],

    )

    方式2:自定义规则函数处理数据

    import re

    from django.forms import Form

    from django.forms import widgets

    from django.forms import fields

    from django.core.exceptions import ValidationError

    # 自定义验证规则

    def mobile_validate(value):

    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')

    if not mobile_re.match(value):

    raise ValidationError('手机号码格式错误')

    class PublishForm(Form):

    title = fields.CharField(max_length=20,

    min_length=5,

    error_messages={'required': '标题不能为空',

    'min_length': '标题最少为5个字符',

    'max_length': '标题最多为20个字符'},

    widget=widgets.TextInput(attrs={'class': "form-control",

    'placeholder': '标题5-20个字符'}))

    # 使用自定义验证规则

    phone = fields.CharField(validators=[mobile_validate, ],

    error_messages={'required': '手机不能为空'},

    widget=widgets.TextInput(attrs={'class': "form-control",

    'placeholder': u'手机号码'}))

    email = fields.EmailField(required=False,

    error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'},

    widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))

    展开全文
  • Django教程之Ajax页面无刷新数据回显 问题场景: 在日常工作中会涉及到好多查询信息,有根据手机号的,有根据人,还有一些是因场景而定的特殊查询,需要频繁的去数据库中写sql去查询,所有就想做一个运维小工具,让...

    Django教程之Ajax页面无刷新数据回显

    问题场景:
    在日常工作中会涉及到好多查询信息,有根据手机号的,有根据人,还有一些是因场景而定的特殊查询,需要频繁的去数据库中写sql去查询,所有就想做一个测试小工具,让人使用起来更方便一些

    前提条件:
    工具查询列表(页面有点丑陋,回头再写个样式)
    在这里插入图片描述

    数据库结构:
    id,name,url为主要结构
    其中url 目的为 相对应的html页面
    比如:手机号 对应 phone.html
    姓名 对应 name.html等

    根据本地数据库中的数据,展示列表,然后点击进行不同的页面的跳转

    # 运维小工具首页
    def index(request):
            tool_last_list = Tool.objects.order_by('c_time')[:5]
            context = {'tool_last_list': tool_last_list}
            return render(request, 'tool/index.html', context)
    

    这个方法是查询本地数据库中的工具列表,然后将列表传入到index.html页面

    urls.py 文件中

    #定义为空值,默认会找index方法
        path('', views.index, name='index'),
    

    这个是首页展示的url

    首页列表:
    在这里插入图片描述

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {% if tool_last_list %}
        <ul>
        {% for tool in tool_last_list %}
            <li style="list-style-type:none"><a href="{% url 'tool:tools' tool.url %}">{{ tool.name }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No polls are available.</p>
    {% endif %}
    </body>
    </html>
    

    二、点击A标签进行跳转
    前提:因为数据结构为 名称-路由,所以 index页面中A标签中href 为字符串形式,
    这其中涉及到一个问题
    在urls.py中,path参数的定义
    如果是id的话,开头是以path(‘int:id/’,view),但是文中的形式是字符串形式
    所有要以path('<str:name>/', views.tools,name='tools'),,意思是 会按照字符串开头的进行匹配

    接受A标签中的name参数,用来实现变量替换固定名称

    #视图跳转控制
    def tools(request, name):
        return render(request,'tool/'+name+'.html')
    

    三、Ajax页面

    html页面:

    {% load static %}  #这个是django 中的加载,加载应用中的static静态目录
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
       <script src="{% static 'tool/js/jquery-1.8.3.min.js' %}"></script>
    </head>
    <body>
    <form action="">
        手机号:<input type="text" id="phone">
    </form>
    <button class="btn" id = "search">click</button>
    <p class="con"></p>
    

    ajax:

     <script>
     $("#search").click(function () {
     $.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}'}});//post请求时用来绕过csrf验证的,同表单提交的{% csrf_token %}一样
            // 发送Ajax请求
            var phone = $("#phone").val()
          $.ajax({
               url:"/tool/phone",
               type:"post",
               data:{'phone':phone},
               success:function (data) {
                   console.log(data);
                   //将返回的值替换到html p标签中
                   $(".con").html(data)
     }
            })
        })
    
    </script>
    

    views 方法:

    def guides(request):
        if request.method == 'POST':
            content = request.POST["phone"]
            return JsonResponse(content,safe=False)
    

    问题总结:
    1、‘QueryDict’ object is not callable 对象不可调用
    解决方案:
    content = request.POST(“phone”)更改为 [‘phone’]

    2、In order to allow non-dict objects to be serialized set the safe parameter to False 为了允许非字典对象被序列化,请将安全参数设置为False
    return JsonResponse(content) 更改为 return JsonResponse(content,safe=False)

    3、ajax url 与urls中的要保持一下
    比如:urls.py 中 path(‘phone’,view)没有/
    ajax.url 中 tool/phone/
    这样也可以请求成功,但是获取不到值,返回的也是一个页面,坑的很,一定要注意

    展开全文
  • Django 模型(数据库)Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富...

    Django 模型(数据库)

    Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。

    本节的最后有源代码,但建议初学者按照代码操作,有问题再下载源代码和自己的代码进行比较。

    多动手,这是学习编程最好的方法!

    1. 新建项目和应用django-admin.py startproject learn_models # 新建一个项目

    cd learn_models # 进入到该项目的文件夹

    django-admin.py startapp people # 新建一个 people 应用(app)

    补充:新建app也可以用 python3 manage.py startapp people, 需要指出的是,django-admin.py 是安装Django后多出的一个命令,并不是运行的当前目录下的django-admin.py(当前目录下也没有),但创建项目会生成一个 manage.py 文件。

    那project和app什么关系呢?

    一个项目一般包含多个应用,一个应用也可以用在多个项目中。

    2. 添加应用

    将我们新建的应用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。# Application definition

    INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'people',

    ]

    3. 修改models.py

    我们打开 people/models.py文件,修改其中的代码如下:from django.db import models

    class Person(models.Model):

    name = models.CharField(max_length=30)

    age = models.IntegerField()

    我们新建了一个Person类,继承自models.Model, 一个人有姓名和年龄。

    这里用到了两种Field,更多Field类型可以参考教程最后的链接。

    4. 创建数据表

    我们来同步一下数据库(我们使用默认的数据库 SQLite3,无需配置)

    先 cd 进入 manage.py 所在的那个文件夹下,输入下面的命令

    4.1 第一步,生成迁移文件

    生成的python migration文件是描述数据库结构变化的python3 manage.py makemigrations

    9f5f528623015794191e99c00f14a2d7.png

    需要记住,这时候,数据库还没真正变化,只是生成了描述数据库变化的文件。

    感兴趣的同学可以打开 生成的文件,在 migrations 文件夹中,内容如下(目前我们不需要看懂每一行,大致看一看,知道这个文件是做什么的就行)# Generated by Django 2.2.7 on 2019-11-24 05:57

    from django.db import migrations, models

    class Migration(migrations.Migration):

    initial = True

    dependencies = [

    ]

    operations = [

    migrations.CreateModel(

    name='Person',

    fields=[

    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

    ('name', models.CharField(max_length=30)),

    ('age', models.IntegerField()),

    ],

    ),

    ]

    好了,我们继续下一步。

    4.2 将结构变化应用到数据库python3 manage.py migrate

    611f440eb5a7db907facd6c68cbfa19e.png

    我们会看到,Django将一系列变化应用到了数据库中。

    细心的读者可能会发现,除了 people.0001_initial 那一条,还有很多 django 内置的应用的表,他们是用户及用户认证等相关的,我们可以先不用管它,不影响本节的学习。

    那接下来如何使用呢?

    5. 使用 Django 提供的 QuerySet API

    Django提供了丰富的API, 下面演示如何使用它。

    [可选]推荐安装 bpython 或 ipython,它们会使用你在终端上调试更加方便。$ python3 manage.py shell

    >>> from people.models import Person

    >>> Person.objects.create(name="WeizhongTu", age=24)

    >>>

    我们新建了一个用户WeizhongTu 那么如何从数据库是查询到它呢?>>> Person.objects.get(name="WeizhongTu")

    >>>

    我们用了一个 .objects.get() 方法查询出来符合条件的对象,但是大家注意到了没有,查询结果中显示,这里并没有显示出与WeizhongTu的相关信息,如果用户多了就无法知道查询出来的到底是谁,查询结果是否正确,我们重新修改一下 people/models.py

    name 和 age 等字段中不能有 __(双下划线 在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)

    也不能有Python中的关键字,name 是合法的,student_name 也合法,但是student__name不合法。try, class, continue 也不合法,因为它是Python的关键字( import keyword; print(keyword.kwlist) 可以打出所有的关键字)from django.db import models

    class Person(models.Model):

    name = models.CharField(max_length=30)

    age = models.IntegerField()

    def __str__(self):

    return self.name

    按 CTRL + C 退出当前的 Python shell, 重复上面的操作,我们就可以看到:

    7e08074beb7d89ecf86b1fc7fa50b403.png

    新建一个对象的方法有以下几种:Person.objects.create(name=name,age=age)

    p = Person(name="WZ", age=23)

    p.save()

    p = Person(name="TWZ")

    p.age = 23

    p.save()

    Person.objects.get_or_create(name="WZT", age=23)

    这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

    获取对象有以下方法:Person.objects.all()

    Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存

    Person.objects.get(name=name)

    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter

    Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人

    Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件

    Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人

    Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写

    Person.objects.filter(name__regex="^abc")  # 正则表达式查询

    Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写

    filter是找出满足条件的,当然也有排除符合某条件的

    Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象

    Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名称含有abc, 但是排除年龄是23岁的

    源代码下载:

    参考文档:

    展开全文
  • from django.shortcuts import render from django.shortcuts import redirect from . import models # Create your views here. def index(request): pass return render(request, 'login/index.html') def login...
  • 微软出Django教程啦!

    2021-06-11 00:18:48
    下面来看一下大名鼎鼎的微软写的Django教程,是如何让小白一步一步上手的。 01.开发环境准备 工欲善其事,必先利其器,看一下微软列出的Django开发环境是什么样的。 开发工具 建议用vscode ,其实Python的开发工具有...
  • 但不管怎么样,它至少包含CMDB资产管理的主体内容,如果你能从中有点收获,那么教程的目的就达到了。 项目的整体代码托管在GitHub上,地址如下: 评论总数: 38 跟着后面敲完了,还是一脸懵逼 By 铁憨憨0917 On ...
  • 完成By多浪的河流On2020年11月15日 19:01回复老师,请教一下,第三步添加静态文件后,css样式加载不出来。控制台报错GET ...我的目录文件和内容和你的教程是一样的。By一口一个糯米滋On2020年4月2日 11:...
  • QueryDict对象阅读:31578评论:5一定要初一区分QueryDict和...在HttpRequest对象中,GET和POST属性都是一个django.http.QueryDict的实例。也就是说你可以按本文下面提供的方法操作request.POST和request.GET。reques...
  • 采用 visual studio 2019 开发Django 项目,微软有相关的教程,链接如下 https://docs.microsoft.com/zh-cn/visualstudio/python/learn-django-in-visual-studio-step-01-project-and-solution?view=vs-2017 pycharm...
  • 微软Django教程

    2021-07-14 08:38:10
    最近小编发现微软出了一个Django的入门教程,思路清晰,简单易学 ,非常不错,赶紧分享给大家。 微软出了有英文和中文版本(文末有链接),英文写的还是非常简洁易懂的!其实对于初学者来说,反而越薄的资料越...
  • Django 开发内容管理系统用Django开发一个简易的内容管理系统,比如显示新闻的列表,点击进去可以看内容详情等,新闻发布网站。一,搭建互不干扰的 Python 包开发环境我们有的时候会发现,一个电脑上有多个项目,一...
  • Django快速入门

    2021-03-17 01:16:14
    >>> import django>>> print(django.get_version())1.9.1这...在本教程中,将引导您完成创建一个基本的民意调查 (poll) 的应用。这将包括两部分:一个公共网站,让人们在上面查看投票和投票。一个...
  • 我正在尝试关注Django Tutorial, Part 2,并且最后一部分关于模板。我遇到的问题是我正在更改base_site.html并且我的网站中没有反映任何更改。我正在使用Python 3.4根据教程,我在manage.py所在的目录中创建了一个带...
  • 基于Django2.2、Bootstrap4、Python3.7.3、Pycharm2018、windows10视频教程也已同步更新本项目是一个手把手,一步一步深入的教学项目,在此过程中,有些代码是临时性的,请务必仔细阅读完全文,不要断章取义,...
  • 前文章节提到过,不同 Django 版本对 Python 版本的要求也是不一样的 ,Django 对 Python 版本的支持,如表格所示:Django版本与Python版本对应表Django版本Python版本1.82.7, 3.2, 3.3, 3.4, 3.51.9, 1.102.7, 3.4,...
  • 源码看的我有点晕 By stay_life On 2020年3月24日 19:55 回复 这个得从Django的ORM系统说起....看源码我也晕^-^ 博主 回复 stay_life 2020年4月14日 13:20 回复 博主好,登录时候是哪个环节把user.password进行了...
  • django教程03-maoz

    2021-03-23 14:33:17
    文章目录《Django Web框架教学笔记》目录静态文件Django中的应用 - app创建应用app应用的结构应用的分布式路由include 函数应用的模板模型层Django下配置使用 mysql 数据库模型(Models)Django 的 ORM框架模型示例...
  • django教程02-maoz

    2021-03-23 14:31:08
    Django Web框架教学笔记》 目录 文章目录《Django Web框架教学笔记》目录Django的框架设计模式模板 TemplatesDjango 模板语言模板的传参模板的变量XSS攻击反射型xss存储型xssDOM xss模板的标签过滤器模板的继承url...
  • 教程展示了如何使用 Django 的测试框架自动对您的网站进行单元测试。 本地图书馆目前有显示所有书籍和作者列表的页面、书籍和作者项目的详细视图、更新书籍实例的页面以及创建、更新和删除作者项目的页面(还有...
  • 一 了解DjangoDjango 是Python下最具有代表性的WEB框架;是一个开放源代码的web应用框架,使用Python编写;遵守BSD版权,初次发布于2005年7月,于2008年9月颁布正式版1.0;采用了MVC的软件设计模式,模型M-视图V-...
  • Django-创建一个完整的项目-详细教程

    千次阅读 2021-10-28 17:36:10
    本文档将详细说明如何创建一个完整的Django项目.在下个文档会讲解如何连接mysql数据库并利用python与数据库的交互实现表的增删改查功 1.分析 我们创建Django项目,可以在cmd中实现,也可以在pycharm中的Terminal终端中...
  • Django简介特点重量级框架MVT模式工程搭建1. 创建虚拟环境2. 安装Django3. 虚拟环境和pip的命令创建工程1. 创建2. 工程目录说明3. 运行开发服务器创建子应用1. 创建2. 子应用目录说明3. 注册安装子应用创建视图1. ...
  • Django学习入门教程基础部分一、简单配路由二、接收url的参数三、url正则表达式传参四、表单提交(GET、POST、页面跳转)五、登录案例:综合案例部分一、班级表的操作第一节:读取class表的数据,在界面显示第二节:...
  • 一、新增多条测试数据 在“【Django 2021年最新版教程8】操作Mysql数据库 mysqlclient安装和使用”介绍了新增数据插入数据库的方法 二、查询类型
  • 教程中所做的主要更改是将'polls'应用程序添加到INSTALLED_APPS中,并为数据库设置路径。在# Django settings for mysite project. DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( # ('Arye Barnehama', 'arye@...
  • Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!采用了MVC的框架模式,即模型M,视图V和控制器C,也可以称为MVT模式,模型M,视图V,模板T。在学习Django的过程中将学到的知识...
  • django安装教程

    千次阅读 多人点赞 2021-01-24 11:11:49
    文章目录一、确保已安装好python和pycharm工具二、安装django并配置环境变量,两个安装方法1)cmd中命令安装(我认为更简单)2)在django官网中下载最新版本的django安装包三、创建第一个Django工程。五、启动web...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,574
精华内容 13,029
关键字:

django教程