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的作用

  1. 生成HTML
  2. 验证用户输入的合法性
    配置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的区别

代码堆放的方式不同

实现Django动态路由系统的方法

get、ffilter、all的区别

在这里插入图片描述

扩展:关于modelForm的应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值