python&&Django框架&&学习笔记二
Models.py文件配置总结
Model连表操作
一对多和一对一之间多表查询
#查找用户类型名称是超级管理员的对应的用户信息的用户名称
UserInfo.objects.filter(user_type__name="超级管理员").values("username")
多对多表之间的查询
class UserInfo(models.Model):
username = models.CharField(max_length=50)
password= models.CharField(max_length=50)
email = models.EmailField()
class UserGroup(models.Model):
GroupName = models.CharField(max_length=50)
user = models.ManyToManyField("UserInfo")
#为用户组A增添新用户DFQ
u1 = models.UserInfo.objects.get(username="DFQ")
g1 = models.UserGroup.objects.get(GroupName="用户组A")
#方法一."user"建立g1与u1之间多对多关系
g1.user.add(u1)
#方法二.usergroup_set是固定搭配,建立g1与u1之间多对多关系
u1.usergroup_set.add(g1)
#获取用户组等于"用户组A"的所有用户信息
UserGroup.objects.filter(GroupName="用户组A").values(user)
form的作用
- 生成HTML
- 验证用户输入的合法性
配置forms.py,定义表单结构
from django import forms
class ALogin(forms.Form):
username = forms.CharField()
#自定义错误提示信息
#username = forms.CharField(error_messages={'required':('用户名不能为空'),'invalid':('用户名格式错误')})
email = forms.EmailField(required=True)
#定义email的样式,方式一
# email = forms.CharField(widget=forms.EmailInput(attrs={'css':'add'}))
#自定义错误提示信息
#email = forms.EmailField(required=True)(error_messages={'required':('邮箱不能为空'),'invalid':('邮箱格式错误')})
ip = forms.IPAddressField()
'''
#定义email的样式,方式二
def __init__(self):
self.fields['email'].widget_attrs()
'''
配置views.py,在html中实现form功能
from django.shortcuts import render,render_to_response
from web import forms
def index(request):
#创建form类对象
formObj = forms.ALogin()
#将form类对象嵌套到index.html内
if request.method == "POST":
#检测请求格式的合法性
#令返回的data等于checkForm ,可以在用户点击提交后之前输入的内容不自动清空!!
checkForm = forms.ALogin(request.POST)
#返回检测的合法性结果
checkResult = checkForm.is_valid()
if checkResult == True:
pass
else:
errorObj = checkForm.errors
#仅输出第一条字符串类型的错误信息
firstErrorMsg = checkForm.errors.as_data().values()[0][0].messages[0]
print(firstErrorMsg)
print(checkResult)
return render_to_response('web/index.html',{'data':formObj,'error':errorObj })
配置index.html,显现form类对象
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Form</h1>
<form action="/web/login/" method="POST">
<div>username:{{data.username}}</div>
<div>email:{{data.email}}</div>
<div>ip:{{data.ip}}</div>
<div>
<input type="submit" value="提交">
<label style="color:red;">{{ error.as_ul }}</label>
</div>
</form>
</body>
</html>
通过令返回的data等于checkForm ,可以令用户点击提交后之前输入的内容不自动清空
自定义错误提示信息
email = forms.EmailField(required=True)(error_messages={‘required’?‘邮箱不能为空’),‘invalid’?‘邮箱格式错误’)})
Ajax的使用
配置index.html页面使用Ajax向后台发送数据
<!doctype html>
<html>
<head>
<!--对页面编码进行设置-->
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<!--兼容IE6浏览器-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<title>demo 10</title>
<script src="/static/jquery/jquery-1.11.0.min.js"></script>
</head>
<body>
<input type="text" id="na" />
<input type="submit" value="ajax提交" onclick="DoAjax();"/>
<script type="text/javascript">
function DoAjax(){
//获取id等于name的值
var temp = $('#na').val()
//将值传到后台
$.ajax({
//配置请求发给谁
url:'/AjaxDemo/ajax/',
type:'POST',
//配置传到后台的值,此处是一个字典,key是dat,value是temp
data:{dat:temp},
//若本次请求成功,执行以下函数的内容
success:function(arg){
//使用"jQuery.parseJSON"将接收到的JSON数据转为对象类型
var rcvObj = jQuery.parseJSON(arg)
//输出后台HttpResponse返回的值
console.log(rcvObj)
console.log("success");
},
//若本次请求失败,执行以下函数的内容
error:function(arg){
console.log("failed");
}
});
}
</script>
</body>
</html>
配置主路由LearnDjangoDemoT urls.py文件,配置对于AjaxDemo的访问交由名为AjaxDemo的app处理
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('web/', include('web.urls')),
path('AjaxDemo/', include('AjaxDemo.urls')),
]
创建名为AjaxDemo的app
D:\backupAll\eclipseRoot\LearnDjangoDemoT>python manage.py startapp AjaxDemo
D:\backupAll\eclipseRoot\LearnDjangoDemoT>dir
驱动器 D 中的卷是 听说你很重要
卷的序列号是 0D1E-0920
D:\backupAll\eclipseRoot\LearnDjangoDemoT 的目录
2019/09/26/周四 22:28 <DIR> .
2019/09/26/周四 22:28 <DIR> ..
2019/09/23/周一 23:52 387 .project
2019/09/23/周一 23:52 323 .pydevproject
2019/09/24/周二 11:08 <DIR> .settings
2019/09/26/周四 22:45 <DIR> AjaxDemo
2019/09/24/周二 13:11 0 db.sqlite3
2019/09/23/周一 23:19 <DIR> LearnDjangoDemoT
2019/09/23/周一 23:18 657 manage.py
2019/09/26/周四 23:06 <DIR> static
2019/09/26/周四 22:31 <DIR> templates
2019/09/24/周二 14:59 <DIR> web
4 个文件 1,367 字节
8 个目录 6,759,292,928 可用字节
配置从路由AjaxDemo urls.py文件,配置当访问http://localhost:9000/AjaxDemo/ajax/时,交由AjaxDemo views.py文件处理
from django.contrib import admin
from django.urls import path,include
from AjaxDemo import views
urlpatterns = [
path('ajax/', views.ajax),
]
配置AjaxDemo views.py文件,接收index.html以POST方式发送的数据,并返回数据到index.html页面
from django.shortcuts import render,render_to_response,HttpResponse
import json
# Create your views here.
def ajax(request):
if request.method == "POST":
print(request.POST)
#定义返回的对象
data = {'status':0,'msg':'请求成功','data':[11,22,33,44]}
#return HttpResponse("ok")
#使用"json.dumps"对返回的对象序列化操作形成json串并返回到前端html页面
return HttpResponse(json.dumps(data))
else:
return render_to_response("Ajax/index.html")
Ajax请求示例框架图
小小知识点
HttpResponse、render_to_response、redirect的区别
HttpResponse:返回一个字符串
render_to_response:对html进行数据嵌套、渲染后,返回html页面
redirect:直接跳转到另外的页面
跨表差用双下划线
如“models.Asset.onjects.filter(user_group__GroupName=‘用户组B’)”
跨表取值,用点
如“{{ item.user_group.GroupName }}”
web程序的声明周期
Django的整体请求流程
MVC与MTV的区别
代码堆放的方式不同