一、model常用操作

  1、13个API查询:all,filter,get ,values,values_list,distinct,order_by ,reverse , exclude(排除),count,first,last,esits(判断是否存在)

  需要掌握的all、values、values_list的区别

    all:打印的是一个QuerySet集合,一个列表里面放的对象

    values :是一个字典形式

    values_list:是一个元组形式  

  all的性能是最低的

  2、only和defer

  1. datalist = models.Userinfo.objects.all().only("name","email") #拿到的还是一个QuerySet集合,仅仅取name和email
  2. for item in datalist:
  3. print(item.id)
  4. print(item.name)
  5. print(item.pwd) #只要表里有这个字段,一样会取到值,额外的会再发一次请求
  6.  
  7. datalist = models.Userinfo.objects.all().defer("name","email") #阻止,不取name和email
  8. for item in datalist:
  9. print(item.id)
  10. print(item.pwd)

  注意:用only的话就去取only里面的字段,取其他的字段效率太低了,尽可能的少的连接数据库

  3、路由系统

  反向生成URL:

    有两种方式:{% url "a1" %}

          reverse("a1")

用reverse需要导入     from django.core.urlresolvers import reverse

  1. /index/ func name=a1
  2. {% url "a1"}
  3. reverse('a1')
  4.  
  5. /index/(\d+)/ func name=a2
  6. {% url "a2" 11 %}
  7. reverse('a2',args=(11,))
  8.  
  9. /index/(?P<nid>\d+)/ func name=a3
  10. {% url "a2" nid=11 %}
  11. reverse('a3',kwargs={'nid':11})

 4、Django的生命周期

Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)

    1、首先走wsgi模块,这个模块也是一个协议,包括wsgiref和uwsgi。

    2、然后路由分配-------views视图

    3、从数据库取数据-----------渲染到html

    注意如果导入js文件,是不会渲染的。

  5、HTTP协议

    详见下一篇博客

二、Form组件

一、Form组件介绍

Form组件可以做的几件事情:

  1、用户请求数据验证

  2、自动生成错误信息

  3、打包用户提交的正确信息

  4、如果其中有一个错误了,其他的正确这,保留上次输入的内容

  4、自动创建input标签并可以设置样式

二、Form组件的使用

  1、创建规则

  1. class Foo(Form): #必须继承
  2. username = xxx
  3. password = xxx
  4. email = xxx
  5. 注意这里的字段必须和inputname字段一致

  2、数据和规则进行匹配

先导入view.py

  1. from django.forms import Form
  2. from django.forms import fields
  3. from django.forms import widgets
  1. from django.shortcuts import render,redirect
  2. from app01 import models
  3. # Create your views here.
  4. from django.forms import Form
  5. from django.forms import fields
  6. from django.forms import widgets
  7. # 1、创建规则
  8. class TeacherForm(Form): #必须继承Form
  9. # 创建字段,本质上是正则表达式
  10. username = fields.CharField(
  11. required=True, #必填字段
  12. error_messages={"required":"用户名不能为空!!"}, #显示中文错误提示
  13. widget=widgets.TextInput(attrs={"placeholder":"用户名","class":"form-control"}) #自动生成input框
  14. )
  15. password = fields.CharField(required=True, error_messages={'required': '密码不能为空'},
  16. widget=widgets.TextInput(attrs={'placeholder': '密码', 'class': 'form-control'})) # 不能为空
  17. email = fields.EmailField(
  18. required=True,
  19. error_messages={"required":"邮箱不能为空!!","invalid":"无效的邮箱"},
  20. widget=widgets.EmailInput(attrs={"placeholder": "邮箱", "class": "form-control"}) # 自动生成input框
  21. ) #不能为空且邮箱格式要一致
  22.  
  23. # 2、使用规则:将数据和规则进行匹配
  24. def teacherindex(request):
  25. teacher_obj = models.UserInfo.objects.all()
  26. # print(teacher_obj)
  27. return render(request,"teacherindex.html",{"teacher_obj":teacher_obj})
  28. def add(request):
  29. if request.method=="GET":
  30. form = TeacherForm() #只是让显示一个input框
  31. return render(request,"add.html",{"form":form })
  32. else:
  33. form = TeacherForm(data=request.POST)
  34. # print(form) #<QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
  35. if form.is_valid():# 开始验证
  36. # print('执行成功',form.cleaned_data) # 所有匹配成功,字典
  37. # {'username': 'asd', 'password': 'sdf', 'email': 'sadf@live.com','ut_id':1}
  38. form.cleaned_data['ut_id'] = 1 #要分的清是班主任还是讲师
  39. models.UserInfo.objects.all().create(**form.cleaned_data)
  40. return redirect("/teacherindex/")
  41. else:
  42. # print("=====?",form.errors,type(form.errors))#返回失败的结果
  43. # print(form.errors["username"][0]) #拿到返回失败的结果,渲染到页面
  44. return render(request,"add.html",{"form":form})

html.py

  1. {% block right %}
  2. <h1>添加老师信息</h1>
  3. <hr>
  4. <form method="post" novalidate>
  5. {% csrf_token %}
  6. <p>姓名:{{ form.username }}</p>{{ form.errors.username.0 }}
  7. <p>密码:{{ form.password }}</p>{{ form.errors.password.0 }}
  8. <p>邮箱:{{ form.email }}</p>{{ form.errors.email.0 }}
  9. <p><input type="submit" value="提交"></p>
  10. </form>
  11. {% endblock %}

如果访问视图的是一个GET 请求,它将创建一个空的表单实例并将它放置到要渲染的模板的上下文中。这是我们在第一个访问该URL 时预期发生的情况。

如果表单的提交使用POST 请求,那么视图将再次创建一个表单实例并使用请求中的数据填充它:form = NameForm(request.POST)。这叫做”绑定数据至表单“(它现在是一个绑定的表单)。

我们调用表单的is_valid()方法;如果它不为True,我们将带着这个表单返回到模板。这时表单不再为空(未绑定),所以HTML 表单将用之前提交的数据填充,然后可以根据要求编辑并改正它。

如果is_valid()True,我们将能够在cleaned_data 属性中找到所有合法的表单数据。在发送HTTP 重定向给浏览器告诉它下一步的去向之前,我们可以用这个数据来更新数据库或者做其它处理。

注意: form = TeacherForm()  #没有参数,只是一个input框

    form = TeacherForm(data=request.POST) # 数据和规则放置一起 (添加的时候用)

    form = TeacherForm(initial={'username':obj.username,'password':obj.password,'email':obj.email})   # 显示input,并且将数据库中的默认值填写到input框中 (编辑的时候用)

Widgets

每个表单字段都有一个对应的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

三、数据库表设计

设计表时注意的几点:

  1、 nid = models.AutoField(primary_key=True)        #如果不指定django会默认加上id的

    nid = models.BigAutoField(primary_key=True)   #但那些整型满足不了你的时候,就用BigAutoField

  2、对于类的注释一般加在类里面

  3、verbose_name=“标题”   字段的中文提示

  4、ForeignKey(to = "表名",tofield= "字段")    #这两个to可以不用写,但是关联的表名一定要写

  5、releated_name = "uuu"   反向查询。如果一个表中有多个ManyTwoMany()或者ForeignKey()必须加上releated_name

  6、字段经常变动的适合连表

     字段变化小,不怎么变的适合在一个表中,不进行连表:就用choices

       吧班主任和老师可以放到一个表中、因为他们有相同的属性,如果属性全是一样的,可以放在一个表里(推荐)

     也可以分开放,老师表是老师表,班主任表是班主任表。这样就会进行连表操作,连表有性能消耗。

举例:文章和文章类型

   分析:一个文章有一个类型,一个类型可以对应多个文章(所以文章和文章类型是一对多的关系,关联字段要放在多的一方)

  一:连表设计:

  1. class News(models.Model):
  2. title = models.CharField(max_length=32)
  3. summary = models.CharField(max_length=255)
  4. news_type = models.ForeignKey(to="NewsType")
  5. class NewsType(models.Model):
  6. type_title = models.CharField(max_length=32)
  1. News

  id   title   summary  news_type_id
  1    t....    科技...     2
  2    t....    科技...     1
  3    t....    科技...     2

  1. NewsType:
     id title

  1      图片
  2      挨踢1024
  3      段子

# 查看所有新闻
new_list = models.News.objects.all()
for row in new_list:
print(row.title,row.summary,row.news_type.title)

  二 :放在一个表中的操作:choices

  1. class News2(models.Model):
  2. title = models.CharField(max_length=32)
  3. summary = models.CharField(max_length=255)
  4. news_type_chices = (
  5. (1, '图片'),
  6. (4, '挨踢1024'),
  7. (3, '段子'),
  8. )
  9. news_type = models.IntegerField(choices=news_type_chices)

# 查看所有新闻
new_list = News.objects.all()
for row in new_list:
print(row.title,row.summary, row.get_news_type_display() )

举例二:用户和用户类型

  一:连表设计

  1. class UserType(models.Model):
  2. """
  3. 用户类型表,个数经常变动
  4. """
  5. title = models.CharField(max_length=32)
  6.  
  7. class UserInfo(models.Model):
  8. """
  9. 用户表:讲师和班主任
  10. """
  11. username = models.CharField(max_length=32)
  12. password = models.CharField(max_length=64)
  13. email = models.CharField(max_length=32)
  14. ut = models.ForeignKey(to="UserType")

  二:不连表设计:choices

  1. class UserInfo(models.Model):
  2. # """
  3. # 用户表
  4. # """
  5. username = models.CharField(max_length=32)
  6. password = models.CharField(max_length=64)
  7. email = models.CharField(max_length=32,verbose_name="邮箱")
  8. user_type_choices = (
  9. (1, '班主任'),
  10. (2, '讲师'),
  11. )
  12.  
  13. user_type_id = models.IntegerField(choices=user_type_choices)

四、登录

可设置一个装饰器

  1. def auth(func):
  2. def inner(request,*args,**kwargs):
  3. is_login = request.session.get("is_login", None)
  4. if not is_login:
  5. return redirect("/login/")
  6. ret = func(*args,**kwargs)
  7. return ret
  8. return inner

需要注意的:  

  1、action不写路径,默认提交到当前

  2、向后台提交数据用post,获取数据用get

  3、submit一般加上value,有些浏览器可能会不识别

  4、一般配置文件的键都是大写的

django 之知识点总结以及Form组件的更多相关文章

  1. Django(十六)Form组件扩展

    http://www.cnblogs.com/wupeiqi/articles/6144178.html Form组件 - form表单(验证:保留上次内容) - - Ajax(验证:无需上次内容) ...

  2. Django(十五)Form组件

    参考博客: https://www.cnblogs.com/haiyan123/p/7778888.html http://www.cnblogs.com/wupeiqi/articles/61441 ...

  3. Django框架之Ajax和form组件

    一.Django框架之查漏补缺 1)models,字段概况 name = models.CharField(max_length=) age = models.IntegerField() price ...

  4. Django【第13篇】:Django之Form组件

    django 之知识点总结以及Form组件 一.model常用操作 1.13个API查询:all,filter,get ,values,values_list,distinct,order_by ,r ...

  5. Django【第23篇】:利用Form组件和ajax实现的注册

    利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...

  6. Django框架基础之Form组件

    服务端假设所有用户提交的数据都是不可信任的,所以Django框架内置了form组件来验证用户提交的信息 form组件的2大功能:       1 验证(显示错误信息)       2 保留用户上次输入 ...

  7. 利用Form组件和ajax实现的注册

    一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2 ...

  8. Django学习笔记之利用Form和Ajax实现注册功能

    一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2 ...

  9. Django-利用Form组件和ajax实现的注册

    利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...

随机推荐

  1. 商业版微信小程序开发流程

    一.产品阶段 ①功能规划思维导图——产品经理了解清楚整个项目需求,产出清晰明确的功能需求说明. ②需求报价预算——产品经理确定好功能需求后,输出整个项目开发的报价方案. ③组建技术开发团队——初步确认 ...

  2. DNN-HMM

    <<DNN-HMM.docx>>

  3. eslint 关于CRLF或者LF报错

    在拉取项目代码时,如果有eslint代码校验,但是本地打开会有于CRLF或者LF报错报错,那么怎么处理呢? git有个自动转换换行符功能,在文件commit时会自动转换换行符格式: 不想使用,也可以通 ...

  4. vue父组件如何调用子组件的属性或方法

    常常我们需要组件的拆分,就涉及到父子调用的关系,那么父组件如何调用子组件的属性和方法呢? 子组件child <template> <div> {{msg}} </div& ...

  5. python的sys.args使用

    一.sys 模块 sys是Python的一个「标准库」,也就是官方出的「模块」,是「System」的简写,封装了一些系统的信息和接口. 官方的文档参考:https://docs.python.org/ ...

  6. 深入理解 RPC

    学习资料 https://juejin.im/book/5af56a3c518825426642e004

  7. js 一个对象的属性名是一个变量怎么处理?

    1.这种方法的属性(setAttrName)可以是一个变量. var obj = {}; obj[setAttrName] = 'Tom' 2.这样就可以动态的给js对象添加变量属性. var obj ...

  8. html超文本标记语言基础一

    1,基本格式 <!DOCTYPE html> //声明为 HTML5 文档 <html> <head> <meta charset="utf-8&q ...

  9. 【Convex Optimization (by Boyd) 学习笔记】Chapter 2 - Convex sets(1) 仿射集&凸集

    I. 仿射凸集(Affine and convex sets) 1. 线与线段 假设\(R^n\)空间内两点\(x_1,x_2\, (x_1≠x_2)\),那么\(y=\theta x_1+(1-\t ...

  10. C++中的static关键字总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...