• django学习笔记(二)


    上节内容回顾:
    	1、Django请求生命周期
    		-> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串
    		-> URL对应关系(匹配) -> 视图函数 -> 打开一个HTML文件,读取内容
    		
    	2、创建django projcet
    
    		django-admin startproject mysite
    		
    
    		..
    		
    		mysite
    			mysite
    				- 配置文件
    				- url.py
    				- settings.py
    			
    		cd mysite
    		python manage.py startapp cmdb
    		
    		mysite
    			mysite
    				- 配置文件
    				- url.py
    				- settings.py
    			cmdb
    				- views.py
    				- admin.py
    				- models.py # 创建数据库表
    
    	3、配置
    		
    		模板路径
    		静态文件路径
    		# CSRF
    		
    	4、编写程序
    
    		a. url.py
    			
    			/index/    ->   func
    			
    		b. views.py
    			
    			def func(request):
    				# 包含所有的请求数据
    				...
    				return HttpResponse('字符串')
    				return render(request, 'index.html', {''})
    				retrun redirect('URL')
    				
    		c. 模板语言
    			return render(request, 'index.html', {'li': [11,22,33]})
    			
    			{% for item in li %}
    				<h1>{{item}}</h1>
    			{% endfor %}
    			
    			
    			***********  索引用点 **********
    			<h2> {{item.0 }} </h2>
    
    一、路由系统,URL
    	1、url(r'^index/', views.index),    
    	   url(r'^home/', views.Home.as_view()),
    	2、url(r'^detail-(d+).html', views.detail),  
    	3、url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html', views.detail)
    	   
    	   PS:
    			def detail(request, *args,**kwargs):
    				pass
    	
    	   实战:
    			a. 
    				url(r'^detail-(d+)-(d+).html', views.detail),
    				
    				def func(request, nid, uid):
    					
    					pass
    			
    				def func(request, *args):
    					args = (2,9)
    					
    					
    				def func(request, *args, **kwargs):
    					args = (2,9)
    	   
    			b. 
    				url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html', views.detail)
    				
    				def func(request, nid, uid):
    					pass
    					
    				def funct(request, **kwargs):
    					kwargs = {'nid': 1, 'uid': 3}
    					
    				def func(request, *args, **kwargs):
    					args = (2,9)
    	4、 name
    		
    		对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
    		
    		url(r'^asdfasdfasdf/', views.index, name='i1'),
    		url(r'^yug/(d+)/(d+)/', views.index, name='i2'),
    		url(r'^buy/(?P<pid>d+)/(?P<nid>d+)/', views.index, name='i3'),
    		
    		
    		#反转生成url
    		def func(request, *args, **kwargs):
    			from django.urls import reverse
    			
    			url1 = reverse('i1')                              # asdfasdfasdf/
    			url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
    			url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/
    		
    		
    		xxx.html
    			
    			{% url "i1" %}               # asdfasdfasdf/
    			{% url "i2" 1 2 %}           # yug/1/2/
    			{% url "i3" pid=1 nid=9 %}   # buy/1/9/
    		
    		注:
    			# 当前的URL
    			request.path_info 
    	5、多级路由
    		
    		project/urls.py
    			from django.conf.urls import url,include
    			from django.contrib import admin
    
    			urlpatterns = [
    				url(r'^cmdb/', include("app01.urls")),
    				url(r'^monitor/', include("app02.urls")),
    			]
    			
    		app01/urls.py
    			from django.conf.urls import url,include
    			from django.contrib import admin
    			from app01 import views
    
    			urlpatterns = [
    				url(r'^login/', views.login),
    			]
    			
    		app02/urls.py
    			from django.conf.urls import url,include
    			from django.contrib import admin
    			from app02 import views
    
    			urlpatterns = [
    				url(r'^login/', views.login),
    			]
    	
    	6、默认值(欠)
    	
    	7、命名空间(欠)
    	
    	
    二、视图
    	1、获取用户请求数据
    		request.GET
    		request.POST
    		request.FILES
    		PS:
    			GET:获取数据				
    			POST:提交数据
    			
    	2、checkbox等多选的内容
    		request.POST.getlist()
    	3、上传文件
    		# 上传文件,form标签做特殊设置
    		obj = request.FILES.get('fafafa')
    		obj.name
    		f = open(obj.name, mode='wb')
    		for item in obj.chunks():
    			f.write(item)
    		f.close()
    	
    	4、FBV & CBV
    	   function base view
    	   
    		url.py
    			index -> 函数名
    			
    		view.py
    			def 函数(request):
    				...
    		====》
    		/index/ -> 函数名
    			
    		/index/ -> 类
    		
    		====》
    		
    		建议:两者都用
    		
    	5、装饰器
    		欠
    
    	
    三、模板
    	
    	
    
    四、ORM操作
    	select * from tb where id > 1
    	# 对应关系
    	models.tb.objects.filter(id__gt=1)
    	models.tb.objects.filter(id=1)
    	models.tb.objects.filter(id__lt=1)
    	
    	创建类
    	
    	a. 先写类
    		from django.db import models
    
    		# app01_userinfo
    		class UserInfo(models.Model):
    			# id列,自增,主键
    			# 用户名列,字符串类型,指定长度
    			username = models.CharField(max_length=32)
    			password = models.CharField(max_length=64)
    		
    	b. 在views里面导入模块部上效,所以要注册APP
    
    		INSTALLED_APPS = [
    			'django.contrib.admin',
    			'django.contrib.auth',
    			'django.contrib.contenttypes',
    			'django.contrib.sessions',
    			'django.contrib.messages',
    			'django.contrib.staticfiles',
    			'app01',
    		]
    	然后在app的models写完数据类之后需要运行如下命令,创建表
    	c. 执行命令
    		python manage.py  makemigrations
    		python manage.py  migrate
    		
    	d. ********** 注意 ***********
    		Django默认使用MySQLdb模块链接MySQL
    		主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
    			import pymysql
    			pymysql.install_as_MySQLdb()
    	
    	1. 根据类自动创建数据库表
    		# app下的models.py
    	
    		python manage.py  makemigrations
    		python manage.py  migrate
    		
    		
    		字段:
    			字符串类型
    			
    			
    			数字
    			
    			
    			时间
    			
    			
    			二进制
    			
    			自增models.AutoField(primary_key=True)
    			
    		字段的参数:
    			null               -> db是否可以为空
    			default            -> 默认值
    			primary_key        -> 主键
    			db_column          -> 列名
    			db_index           -> 索引
    			unique			   -> 唯一索引
    			unique_for_date    -> 
    			unique_for_month
    			unique_for_year
    			auto_now           -> 创建时,自动生成时间
    			auto_now_add       -> 更新时,自动更新为当前时间
    			
    				# obj = UserGroup.objects.filter(id=1).update(caption='CEO')
    				# obj = UserGroup.objects.filter(id=1).first()
    				# obj.caption = "CEO"
    				# obj.save()
    				
    			choices			  -> django admin中显示下拉框,避免连表查询
    			     user_choices = (
    				 (1,超级用户),
    				 (2,普通用户),
    				 (3,低级用户),
    				 )
    			    user_type_id = models.IntegerField(choices = user_choices,default= 1)
    			blank             -> django admin是否可以为空
    			verbose_name      -> django admin显示字段中文
    			editable          -> django admin是否可以被编辑
    			error_messages    -> 错误信息欠
    			help_text         -> django admin提示
    			validators		  -> django form ,自定义错误信息(欠)
    			
    			
    			创建 Django 超级用户:python manage.py createsuperuser
    			
    			
    			
    			
    	2. 根据类对数据库表中的数据进行各种操作
    增
    models.User.objects.create(name='qianxiaohu',age=18)
    dic = {'name': 'xx', 'age': 19}
    models.User.objects.create(**dic)
    
    
    obj = models.User(name='qianxiaohu',age=18)
    obj.save()
    删
    models.User.objects.filter(id=1).delete()
    改
    models.User.objects.filter(id__gt=1).update(name='alex',age=84)
    dic = {'name': 'xx', 'age': 19}
    models.User.objects.filter(id__gt=1).update(**dic)
    查
    models.User.objects.filter(id=1,name='root')
    models.User.objects.filter(id__gt=1,name='root') 大于
    models.User.objects.filter(id__lt=1) 小于
    models.User.objects.filter(id__gte=1) 大于等于
    models.User.objects.filter(id__lte=1) 小于等于
    
    models.User.objects.filter(id=1,name='root')
    dic = {'name': 'xx', 'age__gt': 19}
    models.User.objects.filter(**dic)
    
    v1 = models.Business.objects.all()
    # QuerySet ,内部元素都是对象
    
    # QuerySet ,内部元素都是字典
    v2 = models.Business.objects.all().values('id','caption')
    # QuerySet ,内部元素都是元组
    v3 = models.Business.objects.all().values_list('id','caption')
    
    # 获取到的一个对象,如果不存在就报错
    models.Business.objects.get(id=1)
    对象或者None = models.Business.objects.filter(id=1).first()
    
    
    外键:
    v = models.Host.objects.filter(nid__gt=0)
    v[0].b.caption ----> 通过.进行跨表
    
    
    
    
    
    
    外键:
    class UserType(models.Model):
    caption = models.CharField(max_length=32)
    id caption
    # 1,普通用户
    # 2,VIP用户
    # 3, 游客
    
    class User(models.Model):
    age = models.IntergerFiled()
    name = models.CharField(max_length=10)#字符长度
    # user_type_id = models.IntergerFiled() # 约束,
    user_type = models.ForeignKey("UserType",to_field='id') # 约束,
    
    name age user_type_id 
    # A 18 3
    # B 18 2
    # C 18 2
    
    	
    		一对多:
    		
    			a. 外检
    			b. 
    				外键字段_id
    			c.
    				models.tb.object.create(name='root', user_group_id=1)
    				
    			d. 
    				
    				userlist = models.tb.object.all()
    				for row in userlist:
    					row.id
    					row.user_group_id
    					row.user_group.caption
    					
    					
    	=================== 作业:用户管理 ====================
    	1、用户组的增删改查
    	2、用户增删该查
    		- 添加必须是对话框
    		- 删除必须是对话框
    		- 修改,必须显示默认值
    		
    	3、比较好看的页面
    	
    	4、预习:
    		http://www.cnblogs.com/wupeiqi/articles/5246483.html
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
      
    

      

  • 相关阅读:
    循环的其他用法
    if和switch
    Activity and Task Design
    Accessing Resource学习
    Ctrl 和Alt 快捷键设置的原则
    Android代码没有错误,但是运行出错
    Android读取txt文本文档在手机上显示乱码解决方法
    ImageButton介绍及两种透明方案
    Android 的 Button 按钮实现的两种方式
    resdrawable-hdpi ew.png:0: error: invalid symbol: 'new'错误原因是new是关键词呀
  • 原文地址:https://www.cnblogs.com/qiangayz/p/8972791.html
Copyright © 2020-2023  润新知