• day21_雷神_django第四天


    django第四天

    1、form组件

    解决两个事情:

    1. 不想重复提交,数据重置;
    2. 校验规则

    流程:

    (1) 创建form组件对应的类,比如LoginForm
    			(2) 
    			      views.login:
    				          
    						if get请求:
    						   form_obj=LoginForm() 
    						   return render(request,"login.html",{"form_obj":form_obj})  # 由form_obj渲染form表单的有效控件
    		                    
    						   渲染方式三种:
    							        1  
    									   <form action="" novalidate method="post">
    											{% csrf_token %}
    											{{ form_obj.as_p }}
    											<input type="submit">
    									   </form>
    									
    									
    									2 
    		                             <form action="" novalidate method="post">
    										{% csrf_token %}
    										<div>
    											<label for="">用户名</label>
    											{{ form_obj.user }} <span>{{ form_obj.errors.user.0 }}</span>
    										</div>
    										 <div>
    											<label for="">密码</label>
    											{{ form_obj.pwd }}<span>{{ form_obj.errors.pwd.0 }}</span>
    										</div>
    										<input type="submit">
    									</form>
    
    									3
    									
    									<form action="" novalidate method="post">
    										{% csrf_token %}
    										{% for field in form_obj %}
    										   <div>
    											   <label for="">{{ field.label }}</label>
    											   {{ field }}
    										   </div>
    										{% endfor %}
    
    										<input type="submit">
    									</form>
    	                    
    						if post请求:
    						        
    								form_obj = LoginFrom(request.POST)
    							    if form_obj.is_valid():
    								    form_obj.cleaned_data # 所有的有效数据 
                                        									
    								else:
    								    #form_obj.errors                  #  {}
    								    #form_obj.errors.get("user")      #  []
    									
    								return render(request, "login.html", {"form_obj": form_obj})
    

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^register/', views.register),
    ]
    

    models.py

    from django.db import models
    
    # Create your models here.
    
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
        pwd = models.CharField(max_length=32,default=1)
    

    views.py

    from django.shortcuts import render, HttpResponse
    from .models import *
    # Create your views here.
    from django import forms
    from django.forms import widgets
    from django.core.exceptions import ValidationError
    
    
    class RegForm(forms.Form):
        name = forms.CharField(
            label='用户名',
            max_length=16,
            min_length=3,
            error_messages={
                "required": "不能为空",
                "invalid": "格式错误",
                "min_length": "用户名最短3位",
                "max_length": "用户名最长16位"
            }
        )
    
        pwd = forms.CharField(
            error_messages={
                "required": "不能为空",
            },
            widget=widgets.PasswordInput(attrs={})
        )
    
        repeat_pwd = forms.CharField(
            error_messages={
                "required": "不能为空",
            },
            widget=widgets.PasswordInput(attrs={})
        )
    
        email = forms.EmailField()
        phone = forms.CharField()
    
        def clean_user(self):
            val = self.cleaned_data.get('user')  #  注意是cleaned_data
            ret = UserInfo.objects.filter(name=val)
            if not ret:
                return val       # 通过,返回该值,不通过,返回错误信息,ValidationError()
            else:
                raise ValidationError('该用户已注册')
    
        def clean_phone(self):
            val = self.cleaned_data.get('phone')
            import re
            ret = re.search("^1[3578]d{9}$", val)
            if ret:
                return val
            else:
                raise ValidationError('手机号格式错误')
    
        def clean(self):  # clean是全局钩子
            pwd = self.cleaned_data.get('pwd')
            repeat_pwd = self.cleaned_data.get('repeat_pwd')
            if pwd == repeat_pwd:
                return self.cleaned_data
            else:
                raise ValidationError('两次密码不一致')
    
    
    def register(request):
        if request.method == 'POST':
            reg_form = RegForm(request.POST)
            if reg_form.is_valid():
                name = reg_form.cleaned_data.get('name')
                pwd = reg_form.cleaned_data.get('pwd')
                UserInfo.objects.create(name=name, pwd=pwd)
                return HttpResponse('注册成功!')
            else:
                all_err = reg_form.errors.get('__all__')
                print(all_err)
                return render(request, 'register.html', locals())
        reg_form = RegForm()
        return render(request, 'register.html', locals()) # 包含函数执行,到这locals的所有局部变量。
    

    templates

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>注册页面</h1>
    
    
    <form action="" method="post" novalidate>
    
        {% csrf_token %}
        {% for field in reg_form %}
    
            <div>
                <label for=""> {{ field.label }}</label>
                {{ field }} <span>{{ field.errors.0 }}</span>
    
                {% if field.label == 'Repeat pwd' %}
                    <span>{{ all_err.0 }}</span>
                {% endif %}
            </div>
        {% endfor %}
        <button type="submit">提交</button>
    </form>
    </body>
    </html>
    

    2、用户认证auth模块

    request.user 存的是当前用户的对象,没有登录的话是一个匿名用户对象。
    
    
    1 使用auth_user表作为用户表
    
    2 登录:
           user=auth.authenticate(username=user,password=pwd)
    	   auth.login(request,user)  #   session写操作
    	   auth.logout(request)      #   request.session.flush()
    
    	   
       验证   user.is_authenticated()   # 登录状态时,返回True,否则返回False
       
       创建用户:User.objects.create_user(username="egon123",password="1234")
    

    3、 ajax

    locals() 深拷贝 完全独立,模板里改变变量的值,函数里的值不会改变。

    ajax

    	https://www.cnblogs.com/maple-shaw/articles/9524153.html
    	1. 发请求的途径
    		1. 在浏览器地址上输入地址  回车  ——》 GET
    		2. form表单                      ——》 GET / POST
    		3. a标签                         ——》 GET
    	2. ajax
    		使用js技术发送异步请求 一般传输json数据
    		特点:
    			局部刷新 当前页面不刷新
    			异步 
    	
    	1. 计算示例
    	
    		 $.ajax({
    			url:'/calc1/',
    			type:'post',
    			data:{
    				i1:$('[name="ii1"]').val(),
    				i2:$('[name="ii2"]').val()
    			},
    			success:function (res) {
    				console.log(res);
    				$('[name="ii3"]').val(res)
    			}
    		})
    	2. ajax的参数介绍
    		上传文件
    			form_obj = new FormData();
    			form_obj.append('f1', $('#f1')[0].files[0]); 
     # jquery对象转换为dom对象,方法files,可能传多个文件,只要一个,【0】,这就包含了数据得form_data对象。
    			$.ajax({
    				url: '/upload/',
    				type: 'post',
    				processData: false,   
    # 告诉ajax不处理编码方式,enctype=form——data,这个form——obj本身就是这个编码方式,但是django会默认帮你改成urlencode得方式,告诉django不用改
    				contentType: false,	  # 告诉ajax不处理contentType,数据类型,不改请求头
    				data: form_obj,
    				success: function (res) {
    					console.log(res);     # 返回的响应的响应体
    				},
    			})
    
    	2. 
    			headers:{'X-csrftoken':$('[name="csrfmiddlewaretoken"]').val()},
    
    	3、 使用文件
    My name is 侯冰雷 ~~欢迎转载 ~~欢迎关注 ~~欢迎留言
  • 相关阅读:
    关于量子计算机的一些整理 (精心整理原创) (1)
    自然语言交流系统 phxnet团队 创新实训 个人博客 (一)
    自然语言交流系统 phxnet团队 创新实训 项目博客 (一)
    double类型保留2位小数
    main函数位置
    java中main函数解析
    关于函数声明的小知识点
    数据帧、数据包、数据报以及数据段
    chrome 常用快捷键(可以摆脱鼠标哦)
    chrome 如何利用快捷键将光标移动到地址栏
  • 原文地址:https://www.cnblogs.com/houbinglei/p/9896836.html
Copyright © 2020-2023  润新知