码迷,mamicode.com
首页 > 其他好文 > 详细

django(一)

时间:2018-09-11 21:13:53      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:模型   truncate   性问题   北京   bsp   ble   rem   list   工作量   

https://www.cnblogs.com/yuanchenqi/articles/8875659.html

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
    M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
    T 代表模板 (Template):负责如何把页面展示给用户(html)。
    V 代表视图(View):   负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
https://www.cnblogs.com/yuanchenqi/articles/8876685.html

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。

命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回我们在开发项目时,会经常使用name属性反解出URL,当不小心在不同的app的urls中定义相同的name时,可能会导致URL反解错误,为了避免这种事情发生,引入了命名空间。

project的urls.py:
    urlpatterns = [
        url(r^admin/, admin.site.urls),
        url(r^app01/, include("app01.urls",namespace="app01")),
        url(r^app02/, include("app02.urls",namespace="app02")),
    ]

app01.urls:
    urlpatterns = [
        url(r^index/, index,name="index"),
    ]    

app02.urls:
    urlpatterns = [
        url(r^index/, index,name="index"),
    ]

app01.views 
from django.core.urlresolvers import reverse
    def index(request):

        return  HttpResponse(reverse("app01:index"))

app02.views
from django.core.urlresolvers import reverse
    def index(request):

        return  HttpResponse(reverse("app02:index"))
https://www.cnblogs.com/yuanchenqi/articles/8931472.html

django2.0版的path
Django默认支持以下5个转化器:
    str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int,匹配正整数,包含0。
    slug,匹配字母、数字以及横杠、下划线组成的字符串。
    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    path,匹配任何非空字符串,包含了路径分隔符
https://www.cnblogs.com/yuanchenqi/articles/8876856.html

一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。

响应对象主要有三种形式:
    HttpResponse():HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍后面两种形式。
    render():结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
    redirect():传递要重定向的一个硬编码的URL
https://www.cnblogs.com/yuanchenqi/articles/8876892.html

你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python代码之中。
    def current_datetime(request):
        now = datetime.datetime.now()
        html = "<html><body>It is now %s.</body></html>" % now
        return HttpResponse(html)
尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。 让我们来看一下为什么:
对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。
Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。
程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作

模板之过滤器
语法:{{obj|filter__name:param}}
{{ value|default:"nothing" }}如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。
{{ value|length }}返回值的长度。它对字符串和列表都起作用。
{{ value|filesizeformat }}将值格式化为一个 “人类可读的” 文件尺寸 (例如 ‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘, 等等)。
{{ value|date:"Y-m-d" }}如果 value=datetime.datetime.now()
{{ value|slice:"2:-1" }}如果 value="hello world"
{{ value|truncatechars:9 }}如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
value="<a href="">点击</a>" {{ value|safe}}Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:

模板之标签
标签看起来像是这样的: {% tag %}。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})。
for标签:
    遍历每一个元素:可以利用{% for obj in list reversed %}反向完成循环。
        {% for person in person_list %}
            <p>{{ person.name }}</p>
        {% endfor %}
    遍历一个字典:注:循环序号可以通过{{forloop}}显示  
        {% for key,val in dic.items %}
            <p>{{ key }}:{{ val }}</p>
        {% endfor %}
for ... empty:
    for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
        {% for person in person_list %}
            <p>{{ person.name }}</p>
        {% empty %}
            <p>sorry,no person here</p>
    {% endfor %}
if 标签:{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
    {% if num > 100 or num < 0 %}
        <p>无效</p>
    {% elif num > 80 and num < 100 %}
        <p>优秀</p>
    {% else %}
        <p>凑合吧</p>
    {% endif %}
with:使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
csrf_token:这个标签用于跨站请求伪造保护
https://www.cnblogs.com/yuanchenqi/articles/8933283.html

MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动

#sql中的表                                                      
#创建表:
     CREATE TABLE employee(                                     
                id INT PRIMARY KEY auto_increment ,                    
                name VARCHAR (20),                                      
                gender BIT default 1,                                  
                birthday DATA ,                                         
                department VARCHAR (20),                                
                salary DECIMAL (8,2) unsigned,                          
              );

#sql中的表纪录                                                  
  #添加一条表纪录:                                                          
      INSERT employee (name,gender,birthday,salary,department)            
             VALUES   ("alex",1,"1985-12-12",8000,"保洁部");               
  #查询一条表纪录:                                                           
      SELECT * FROM employee WHERE age=24;                               
  #更新一条表纪录:                                                           
      UPDATE employee SET birthday="1989-10-24" WHERE id=1;              
  #删除一条表纪录:                                                          
      DELETE FROM employee WHERE name="alex"                             

#python的类
class Employee(models.Model):
     id=models.AutoField(primary_key=True)
     name=models.CharField(max_length=32)
     gender=models.BooleanField()
     birthday=models.DateField()
     department=models.CharField(max_length=32)
     salary=models.DecimalField(max_digits=8,decimal_places=2)
#python的类对象
      #添加一条表纪录:
          emp=Employee(name="alex",gender=True,birthday="1985-12-12",epartment="保洁部")
          emp.save()
      #查询一条表纪录:
          Employee.objects.filter(age=24)
      #更新一条表纪录:
          Employee.objects.filter(id=1).update(birthday="1989-10-24")
      #删除一条表纪录:
          Employee.objects.filter(name="alex").delete()

DATABASES = {
    default: {
        ENGINE: django.db.backends.mysql,
        NAME:bms,           # 要连接的数据库,连接前需要创建好
        USER:root,        # 连接数据库的用户名
        PASSWORD:‘‘,        # 连接数据库的密码
        HOST:127.0.0.1,       # 连接主机,默认本级
        PORT:3306            #  端口 默认3306
    }
}
https://www.cnblogs.com/yuanchenqi/articles/8963244.html

from django.db import models

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()
    # 与AuthorDetail建立一对一的关系
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    nid = models.AutoField(primary_key=True)
    birthday=models.DateField()
    telephone=models.BigIntegerField()
    addr=models.CharField( max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField( max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)
    # 与Publish建立一对多的关系,外键字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors=models.ManyToManyField(to=Author,)
https://www.cnblogs.com/yuanchenqi/articles/6083427.html

框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。
对于所有Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。     

django的命令行工具
    <1> 创建一个django工程 : django-admin.py startproject mysite
    <2>在mysite目录下创建blog应用: python manage.py startapp blog
    <3>启动django项目:python manage.py runserver 8080
    <4>生成同步数据库的脚本:python manage.py makemigrations  
       同步数据库:  python manage.py migrate   
    <5>当我们访问http://127.0.0.1:8080/admin/时,会出现:
    <6>清空数据库:python manage.py  flush
    <7>查询某个命令的详细信息: django-admin.py  help  startapp
    <8>启动交互界面 :python manage.py  shell
    <9> 终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。
https://www.cnblogs.com/yuanchenqi/articles/7614921.html

#forms.py
from django import forms
class NameForm(forms.Form):
    your_name = forms.CharField(label=Your name, max_length=100)
发送给Django 网站的表单数据通过一个视图处理,一般和发布这个表单的是同一个视图。这允许我们重用一些相同的逻辑。
当处理表单时,我们需要在视图中实例化它:
#views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm
def get_name(request):
    if request.method == POST:
        form = NameForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect(/thanks/)
    else:
        form = NameForm()
    return render(request, name.html, {form: form})
注:Django 原生支持一个简单易用的跨站请求伪造的防护。当提交一个启用CSRF 防护的POST 表单时,你必须使用上面例子中的csrf_token 模板标签。

#forms.py
from django import forms
class RegisterForm(forms.Form):
    username = forms.CharField(max_length=100,error_messages={"min_length":"最短为5个字符","required":"该字段不能为空"},)
    password = forms.CharField(max_length=100,widget=widgets.PasswordInput(attrs={"placeholder":"password"}))
    telephone=forms.IntegerField(error_messages={"invalid":"格式错误"})
    gender=forms.CharField(initial=2,widget=widgets.Select(choices=((1,上海),(2,北京),)))
    email = forms.EmailField()
    is_married = forms.BooleanField(required=False)
每个表单字段都有一个对应的Widget 类,它对应一个HTML 表单Widget,例如<input type="text">。
在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField 具有一个TextInput Widget,它在HTML 中生成一个<input type="text">。
不管表单提交的是什么数据,一旦通过调用is_valid() 成功验证(is_valid() 返回True),验证后的表单数据将位于form.cleaned_data 字典中。这些数据已经为你转换好为Python 的类型。
注:此时,你依然可以从request.POST 中直接访问到未验证的数据,但是访问验证后的数据更好一些。
在上面的联系表单示例中,is_married将是一个布尔值。类似地,IntegerField 和FloatField 字段分别将值转换为Python 的int 和float。

对于<label>/<input> 对,还有几个输出选项:
    {{ form.as_table }} 以表格的形式将它们渲染在<tr> 标签中
    {{ form.as_p }} 将它们渲染在<p> 标签中
    {{ form.as_ul }} 将它们渲染在<li> 标签中

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)
        max_value=None,              最大值
        min_value=None,              最小值 
    FloatField(IntegerField)
        ...
    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模块,pip3 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=‘‘,              帮助提示
    ModelChoiceField(ChoiceField)
        ...                        django.forms.models.ModelChoiceField
        queryset,                  # 查询数据库中的数据
        empty_label="---------",   # 默认空显示内容
        to_field_name=None,        # HTML中value的值对应的字段
        limit_choices_to=None      # ModelForm中对queryset二次筛选
    ModelMultipleChoiceField(ModelChoiceField)
        ...                        django.forms.models.ModelMultipleChoiceField 
    TypedChoiceField(ChoiceField)
        coerce = lambda val: val   对选中的值进行一次转换
        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)
        PS: 抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合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类型
        ...
3、常用选择插件:
    # 单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
https://www.cnblogs.com/yuanchenqi/articles/5658455.html

Tools -> Run manage.py task
MySQL -> Data Source

 

django(一)

标签:模型   truncate   性问题   北京   bsp   ble   rem   list   工作量   

原文地址:https://www.cnblogs.com/larken/p/9569281.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!