一、Form表单验证

用于做用户提交数据的验证
1.自定义规则

a、自定义规则(类,字段名==html中的name值)
b、数据提交-规则进行匹配
代码如下:

  1. """day19_django URL Configuration
  2.  
  3. The `urlpatterns` list routes URLs to views. For more information please see:
  4. https://docs.djangoproject.com/en/1.10/topics/http/urls/
  5. Examples:
  6. Function views
  7. 1. Add an import: from my_app import views
  8. 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
  9. Class-based views
  10. 1. Add an import: from other_app.views import Home
  11. 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
  12. Including another URLconf
  13. 1. Import the include() function: from django.conf.urls import url, include
  14. 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
  15. """
  16. from django.conf.urls import url
  17. from django.contrib import admin
  18. from app01 import views
  19.  
  20. urlpatterns = [
  21. url(r'^admin/', admin.site.urls),
  22. url(r'^login/', views.login),
  23. ]

urls.py

  1. """
  2. Django settings for day19_django project.
  3.  
  4. Generated by 'django-admin startproject' using Django 1.10.2.
  5.  
  6. For more information on this file, see
  7. https://docs.djangoproject.com/en/1.10/topics/settings/
  8.  
  9. For the full list of settings and their values, see
  10. https://docs.djangoproject.com/en/1.10/ref/settings/
  11. """
  12.  
  13. import os
  14.  
  15. # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
  16. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  17.  
  18. # Quick-start development settings - unsuitable for production
  19. # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
  20.  
  21. # SECURITY WARNING: keep the secret key used in production secret!
  22. SECRET_KEY = 'pv#lfw8ywtf=ws8mr%f9b)ihc0s@oj-2$wu^2o@)+(^)$i_9*n'
  23.  
  24. # SECURITY WARNING: don't run with debug turned on in production!
  25. DEBUG = True
  26.  
  27. ALLOWED_HOSTS = []
  28.  
  29. # Application definition
  30.  
  31. INSTALLED_APPS = [
  32. 'django.contrib.admin',
  33. 'django.contrib.auth',
  34. 'django.contrib.contenttypes',
  35. 'django.contrib.sessions',
  36. 'django.contrib.messages',
  37. 'django.contrib.staticfiles',
  38. 'app01',
  39. ]
  40.  
  41. MIDDLEWARE = [
  42. 'django.middleware.security.SecurityMiddleware',
  43. 'django.contrib.sessions.middleware.SessionMiddleware',
  44. 'django.middleware.common.CommonMiddleware',
  45. 'django.middleware.csrf.CsrfViewMiddleware',
  46. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  47. 'django.contrib.messages.middleware.MessageMiddleware',
  48. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  49. ]
  50.  
  51. ROOT_URLCONF = 'day19_django.urls'
  52.  
  53. TEMPLATES = [
  54. {
  55. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  56. 'DIRS': [os.path.join(BASE_DIR, 'templates')]
  57. ,
  58. 'APP_DIRS': True,
  59. 'OPTIONS': {
  60. 'context_processors': [
  61. 'django.template.context_processors.debug',
  62. 'django.template.context_processors.request',
  63. 'django.contrib.auth.context_processors.auth',
  64. 'django.contrib.messages.context_processors.messages',
  65. ],
  66. },
  67. },
  68. ]
  69.  
  70. WSGI_APPLICATION = 'day19_django.wsgi.application'
  71.  
  72. # Database
  73. # https://docs.djangoproject.com/en/1.10/ref/settings/#databases
  74.  
  75. DATABASES = {
  76. 'default': {
  77. 'ENGINE': 'django.db.backends.sqlite3',
  78. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  79. }
  80. }
  81.  
  82. # Password validation
  83. # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
  84.  
  85. AUTH_PASSWORD_VALIDATORS = [
  86. {
  87. 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  88. },
  89. {
  90. 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  91. },
  92. {
  93. 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  94. },
  95. {
  96. 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  97. },
  98. ]
  99.  
  100. # Internationalization
  101. # https://docs.djangoproject.com/en/1.10/topics/i18n/
  102.  
  103. LANGUAGE_CODE = 'en-us'
  104.  
  105. TIME_ZONE = 'UTC'
  106.  
  107. USE_I18N = True
  108.  
  109. USE_L10N = True
  110.  
  111. USE_TZ = True
  112.  
  113. # Static files (CSS, JavaScript, Images)
  114. # https://docs.djangoproject.com/en/1.10/howto/static-files/
  115.  
  116. STATIC_URL = '/static/'
  117. STATICFILES_DIRS = (
  118. os.path.join(BASE_DIR, 'static'),
  119. )

settings.py

  1. from django.shortcuts import render,HttpResponse
  2. from django import forms
  3. from django.forms.utils import ErrorDict
  4. import json
  5. from django.core.exceptions import ValidationError
  6. import re
  7.  
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class LoginForm(forms.Form):
  14. user = forms.CharField(required=True, error_messages={'required':'用户名不能为空'})
  15. pwd = forms.CharField(required=True,
  16. min_length=6,
  17. max_length=12,
  18. error_messages={'required':'密码必须不能为空',
  19. 'min_length':'至少6位',
  20. 'max_length':'最多12位'})
  21. num = forms.IntegerField(error_messages={'required':'数字不能为空', 'invalid':'必须输入数字'})
  22. #url = forms.EmailField()
  23. phone = forms.CharField(validators=[mobile_validate, ],)
  24.  
  25. def login(request):
  26. if request.method == 'POST':
  27. result = {'status':False, 'message':None}
  28. obj = LoginForm(request.POST)
  29. ret = obj.is_valid()
  30. if ret:
  31. print(obj.clean())
  32. result['status'] = True
  33. else:
  34. print(type(obj.errors), obj.errors.as_json())
  35. error_str = obj.errors.as_json()
  36. result['message'] = json.loads(error_str)
  37. return HttpResponse(json.dumps(result))
  38. return render(request, 'login.html')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .error-msg{
  8. background-color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <div>
  14. <div>
  15. <input type="text" name="user" />
  16. </div>
  17. <div>
  18. <input type="text" name="num" />
  19. </div>
  20. <div>
  21. <input type="text" name="phone" />
  22. </div>
  23. <div>
  24. <input type="password" name="pwd" />
  25. </div>
  26. <input type="button" value="提交" onclick="DoSubmit();" />
  27. </div>
  28. <script src="/static/jquery-1.12.4.js"></script>
  29. <script>
  30. function DoSubmit() {
  31. var dict_input = {};
  32. $('input').each(function () {
  33. var v = $(this).val();
  34. var n = $(this).attr('name');
  35. dict_input[n] = v;
  36. });
  37. console.log(dict_input);
  38. $('.error-msg').remove();
  39. $.ajax({
  40. url:'/login/',
  41. type:'POST',
  42. data:dict_input,
  43. dataType: 'json',
  44. success:function (result) {
  45. if(result.status){
  46. location.href = '/index/';
  47. }else{
  48. $.each(result.message, function (k, v) {
  49. console.log(k, v[0].message);
  50. //<sapn class="error-msg">错误信息</span>
  51. var tag = document.createElement('span');
  52. tag.className = 'error-msg';
  53. tag.innerText = v[0].message;
  54. //input[name="user"]
  55. $('input[name="' + k + '"]').after(tag);
  56. })
  57. }
  58.  
  59. },
  60. error:function () {
  61.  
  62. }
  63. })
  64. }
  65. </script>
  66. </body>
  67. </html>

login.html

2.用于做用户提交数据的验证 + 生成HTML标签

代码如下:

  1. from django.shortcuts import render,HttpResponse
  2. from django import forms
  3. from django.forms.utils import ErrorDict
  4. import json
  5. from django.core.exceptions import ValidationError
  6. import re
  7.  
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class LoginForm(forms.Form):
  14. user = forms.CharField(required=True, error_messages={'required':'用户名不能为空'})
  15. pwd = forms.CharField(required=True,
  16. min_length=6,
  17. max_length=12,
  18. error_messages={'required':'密码必须不能为空',
  19. 'min_length':'至少6位',
  20. 'max_length':'最多12位'})
  21. num = forms.IntegerField(error_messages={'required':'数字不能为空', 'invalid':'必须输入数字'})
  22. #url = forms.EmailField()
  23. phone = forms.CharField(validators=[mobile_validate, ],)
  24. #生成input标签,并加属性,设置样式
  25. #test = forms.CharField(widget=forms.TextInput(attrs={'k1':'123','class':'error-msg'}))
  26. #生成下拉列表,真正提交数据还是数字
  27. test_choices = {
  28. (0, '上海'),
  29. (1, '北京'),
  30. }
  31. test = forms.IntegerField(widget=forms.Select(choices=test_choices))
  32. def login(request):
  33. if request.POST:
  34. objPost = LoginForm(request.POST)
  35. ret = objPost.is_valid()
  36. if ret:
  37. print(objPost.clean())
  38. else:
  39. #obj1.errors是ErrorDict,ErrorDict继承dict
  40. # for k,v in objPost.errors.items():
  41. # print(k, v)
  42. # print(objPost.errors['phone'][0])
  43. # print(objPost.errors['user'][0])
  44. # print(objPost.errors['num'][0])
  45. pass
  46. return render(request, 'login.html', {'obj1': objPost})
  47. else:
  48. objGet = LoginForm()
  49. return render(request, 'login.html', {'obj1':objGet})

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .error-msg{
  8. background-color: red;
  9. }
  10. </style>
  11. </head>
  12. <body>
  13. <form action="/login/" method="POST">
  14. <div>
  15. <div>
  16. {{ obj1.user }}
  17. {% if obj1.errors.user %}
  18. <span class="error-msg">{{ obj1.errors.user.0 }}</span>
  19. {% endif %}
  20. </div>
  21. <div>
  22. {{ obj1.pwd }}
  23. {% if obj1.errors.pwd %}
  24. <span class="error-msg">{{ obj1.errors.pwd.0 }}</span>
  25. {% endif %}
  26. </div>
  27. <div>
  28. {{ obj1.num }}
  29. {% if obj1.errors.num %}
  30. <span class="error-msg">{{ obj1.errors.num.0 }}</span>
  31. {% endif %}
  32. </div>
  33. <div>
  34. {{ obj1.phone }}
  35. {% if obj1.errors.phone %}
  36. <span class="error-msg">{{ obj1.errors.phone.0 }}</span>
  37. {% endif %}
  38. </div>
  39. <div>
  40. {{ obj1.test }}
  41. </div>
  42. <input type="submit" value="提交" />
  43. </div>
  44. </form>
  45. </body>
  46. </html>

login.html

二、CSRF

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

  1. """day19_django URL Configuration
  2.  
  3. The `urlpatterns` list routes URLs to views. For more information please see:
  4. https://docs.djangoproject.com/en/1.10/topics/http/urls/
  5. Examples:
  6. Function views
  7. 1. Add an import: from my_app import views
  8. 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
  9. Class-based views
  10. 1. Add an import: from other_app.views import Home
  11. 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
  12. Including another URLconf
  13. 1. Import the include() function: from django.conf.urls import url, include
  14. 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
  15. """
  16. from django.conf.urls import url
  17. from django.contrib import admin
  18. from app01 import views
  19.  
  20. urlpatterns = [
  21. url(r'^admin/', admin.site.urls),
  22. url(r'^login/', views.login),
  23. url(r'^csrf/', views.csrf),
  24. ]

urls.py

  1. from django.shortcuts import render,HttpResponse
  2. from django import forms
  3. from django.forms.utils import ErrorDict
  4. import json
  5. from django.core.exceptions import ValidationError
  6. import re
  7.  
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class LoginForm(forms.Form):
  14. user = forms.CharField(required=True, error_messages={'required':'用户名不能为空'})
  15. pwd = forms.CharField(required=True,
  16. min_length=6,
  17. max_length=12,
  18. error_messages={'required':'密码必须不能为空',
  19. 'min_length':'至少6位',
  20. 'max_length':'最多12位'})
  21. num = forms.IntegerField(error_messages={'required':'数字不能为空', 'invalid':'必须输入数字'})
  22. #url = forms.EmailField()
  23. phone = forms.CharField(validators=[mobile_validate, ],)
  24. #生成input标签,并加属性,设置样式
  25. #test = forms.CharField(widget=forms.TextInput(attrs={'k1':'123','class':'error-msg'}))
  26. #生成下拉列表,真正提交数据还是数字
  27. test_choices = {
  28. (0, '上海'),
  29. (1, '北京'),
  30. }
  31. test = forms.IntegerField(widget=forms.Select(choices=test_choices))
  32. def login(request):
  33. if request.POST:
  34. objPost = LoginForm(request.POST)
  35. ret = objPost.is_valid()
  36. if ret:
  37. print(objPost.clean())
  38. else:
  39. #obj1.errors是ErrorDict,ErrorDict继承dict
  40. # for k,v in objPost.errors.items():
  41. # print(k, v)
  42. # print(objPost.errors['phone'][0])
  43. # print(objPost.errors['user'][0])
  44. # print(objPost.errors['num'][0])
  45. pass
  46. return render(request, 'login.html', {'obj1': objPost})
  47. else:
  48. objGet = LoginForm()
  49. return render(request, 'login.html', {'obj1':objGet})
  50.  
  51. def csrf(request):
  52. return render(request, 'csrf.html')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <!--form提交-->
  9. <form action="/csrf/" method="POST">
  10. {% csrf_token %}
  11. <input type="text" name="v" />
  12. <input type="submit" value="提交" />
  13. </form>
  14.  
  15. <input type="button" value="Ajax提交" onclick="DoAjax();" />
  16. <!--ajax提交-->
  17. <script src="/static/jquery-2.1.4.min.js"></script>
  18. <script src="/static/jquery.cookie.js"></script>
  19. <script>
  20. //获取cookie
  21. var csrftoken = $.cookie('csrftoken');
  22.  
  23. function csrfSafeMethod(method) {
  24. // these HTTP methods do not require CSRF protection
  25. return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  26. }
  27. $.ajaxSetup({
  28. beforeSend: function(xhr, settings) {
  29. if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
  30. xhr.setRequestHeader("X-CSRFToken", csrftoken);
  31. }
  32. }
  33. });
  34.  
  35. function DoAjax() {
  36. $.ajax({
  37. url:'/csrf/',
  38. type:'POST',
  39. data:{'k1':'v1'},
  40. success: function (data) {
  41. console.log(data);
  42. }
  43. })
  44. }
  45. </script>
  46. </body>
  47. </html>

csrf.html

三、Cookie和Session

Cookie保存在客户端浏览器上的一个容器,独立存在
服务器上保存的是session(内存或数据库或缓存),依赖Cookie

  1. """day19_django URL Configuration
  2.  
  3. The `urlpatterns` list routes URLs to views. For more information please see:
  4. https://docs.djangoproject.com/en/1.10/topics/http/urls/
  5. Examples:
  6. Function views
  7. 1. Add an import: from my_app import views
  8. 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
  9. Class-based views
  10. 1. Add an import: from other_app.views import Home
  11. 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
  12. Including another URLconf
  13. 1. Import the include() function: from django.conf.urls import url, include
  14. 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
  15. """
  16. from django.conf.urls import url
  17. from django.contrib import admin
  18. from app01 import views
  19.  
  20. urlpatterns = [
  21. url(r'^admin/', admin.site.urls),
  22. url(r'^login/', views.login),
  23. url(r'^csrf/', views.csrf),
  24. url(r'^cookie/', views.cookie),
  25. url(r'^cookie1/', views.cookie),
  26. url(r'^log/', views.log),
  27. url(r'^index/', views.index),
  28. url(r'^session_login/', views.session_login),
  29. url(r'^session_index/', views.session_index),
  30. url(r'^session_logout/', views.session_logout),
  31. ]

urls.py

  1. from django.shortcuts import render,HttpResponse,redirect
  2. from django import forms
  3. from django.forms.utils import ErrorDict
  4. import json
  5. from django.core.exceptions import ValidationError
  6. import re
  7. from django.views.decorators.csrf import csrf_exempt,csrf_protect
  8. def mobile_validate(value):
  9. mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  10. if not mobile_re.match(value):
  11. raise ValidationError('手机号码格式错误')
  12.  
  13. class LoginForm(forms.Form):
  14. user = forms.CharField(required=True, error_messages={'required':'用户名不能为空'})
  15. pwd = forms.CharField(required=True,
  16. min_length=6,
  17. max_length=12,
  18. error_messages={'required':'密码必须不能为空',
  19. 'min_length':'至少6位',
  20. 'max_length':'最多12位'})
  21. num = forms.IntegerField(error_messages={'required':'数字不能为空', 'invalid':'必须输入数字'})
  22. #url = forms.EmailField()
  23. phone = forms.CharField(validators=[mobile_validate, ],)
  24. #生成input标签,并加属性,设置样式
  25. #test = forms.CharField(widget=forms.TextInput(attrs={'k1':'123','class':'error-msg'}))
  26. #生成下拉列表,真正提交数据还是数字
  27. test_choices = {
  28. (0, '上海'),
  29. (1, '北京'),
  30. }
  31. test = forms.IntegerField(widget=forms.Select(choices=test_choices))
  32. def login(request):
  33. if request.POST:
  34. objPost = LoginForm(request.POST)
  35. ret = objPost.is_valid()
  36. if ret:
  37. print(objPost.clean())
  38. else:
  39. #obj1.errors是ErrorDict,ErrorDict继承dict
  40. # for k,v in objPost.errors.items():
  41. # print(k, v)
  42. # print(objPost.errors['phone'][0])
  43. # print(objPost.errors['user'][0])
  44. # print(objPost.errors['num'][0])
  45. pass
  46. return render(request, 'login.html', {'obj1': objPost})
  47. else:
  48. objGet = LoginForm()
  49. return render(request, 'login.html', {'obj1':objGet})
  50.  
  51. #@csrf_protect 强制给函数加csrf验证
  52.  
  53. @csrf_exempt
  54. #不用做csrf验证
  55. def csrf(request):
  56.  
  57. return render(request, 'csrf.html')
  58.  
  59. #使用Cookie做登录认证
  60. def cookie(request):
  61. print(request.COOKIES)
  62. obj = render(request, 'cookie.html')
  63. #path='/cookie/',Cookie存放路径
  64. obj.set_cookie('k3','v3',path='/cookie/')
  65. return obj
  66.  
  67. def cookie1(request):
  68. print(request.COOKIES)
  69. obj = render(request, 'cookie.html')
  70. #path='/',Cookie全局生效
  71. obj.set_cookie('k1','v1',path='/')
  72. return obj
  73.  
  74. def log(request):
  75. if request.method == 'POST':
  76. u = request.POST.get('user')
  77. p = request.POST.get('pwd')
  78. if u == 'alex' and p == '':
  79. print(u)
  80. red = redirect('/index/')
  81. red.set_cookie('username', u)
  82. return red
  83. else:
  84. return render(request, 'log.html')
  85. else:
  86. return render(request, 'log.html')
  87.  
  88. def index(request):
  89. user = request.COOKIES.get('username')
  90. if user:
  91. return render(request, 'index.html', {'user':user})
  92. else:
  93. return redirect('/log/')
  94.  
  95. #使用session做登录认证
  96. USER_LIST = ['alex','eric','wang','liu']
  97. def session_login(request):
  98. if request.method == 'POST':
  99. u = request.POST.get('user')
  100. p = request.POST.get('pwd')
  101. if u in USER_LIST and p == '':
  102. request.session['user'] = u
  103. return redirect('/session_index/')
  104. return render(request, 'session_login.html')
  105.  
  106. """
  107. def session_index(request):
  108. user = request.session.get('user', None)
  109. if not user:
  110. return redirect('/session_login/')
  111. else:
  112. return render(request, 'session_index.html', {'user':user})
  113. """
  114. def auth(func):
  115. def inner(request, *args, **kwargs):
  116. #print(request, args, kwargs)
  117. user = request.session.get('user', None)
  118. if not user:
  119. return redirect('/session_login/')
  120. return func(request, *args, **kwargs)
  121. return inner
  122.  
  123. @auth
  124. def session_index(request):
  125. user = request.session.get('user', None)
  126. return render(request, 'session_index.html', {'user':user})
  127.  
  128. @auth
  129. def session_logout(request):
  130. del request.session['user']
  131. return redirect('/session_login/')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form action="/session_login/" method="POST">
  9. <input type="text" name="user">
  10. <input type="text" name="pwd">
  11. <input type="submit" value="提交" />
  12. </form>
  13. </body>
  14. </html>

session_login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form action="/session_login/" method="POST">
  9. <input type="text" name="user">
  10. <input type="text" name="pwd">
  11. <input type="submit" value="提交" />
  12. </form>
  13. </body>
  14. </html>

session_index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form action="/log/" method="POST">
  9. <input type="text" name="user">
  10. <input type="text" name="pwd">
  11. <input type="submit" value="提交" />
  12. </form>
  13. </body>
  14. </html>

log.html

四、Model操作

  1. a.基本
  2. b.进阶
  3. c.双下划线
  4. __大于小于操作
  5. __可以跨表
  6.  
  7. class UserInfo(models.Model):
  8. user = models.CharField(max_length=32)
  9. pwd = models.CharField(max_length=32)
  10. queryset = UserInfo.objects.all()
  11.  
  12. print(queryset.query) --SQL语句
  13. [UserInfo对象,UserInfo对象,UserInfo对象,]
  14.  
  15. queryset = UserInfo.objects.all().values('user')
  16. [{'user':'alex'},{'user':'eric'}]
  17.  
  18. queryset = UserInfo.objects.all().value_list('user')
  19. [('alex'),('eric')]
  20.  
  21. =======================================================
  22. 一对多
  23. class UserType(models.Model):
  24. caption = models.CharField(max_length=32)
  25. #超级管理员、普通用户、访客、黑客
  26.  
  27. class UserInfo(models.Model):
  28. user = models.CharField(max_length=32)
  29. pwd = models.CharField(max_length=32)
  30. user_type = models.ForeignKey('UserType')
  31. #user_type_id
  32.  
  33. #创建UserInfo
  34. 1UserInfo.objects.create(user='alex',pwd='',user_type=UserType.objects.get(id=2))
  35. 或:
  36. 2UserInfo.objects.create(user='alex',pwd='',user_type_id=2)
  37.  
  38. #查询
  39. UserInfo.objects.filter(user='alex')
  40. 1、查询所有用户类型为普通用户的所有用户名和密码
  41. uid = UserType.objects.get(caption='普通用户').id
  42. UserInfo.objects.filter(user_type_id=uid)
  43. 或:
  44. queryset = UserInfo.objects.filter(user_type__caption='普通用户') -- 跨表使用双下划线
  45. [UserInfo对象,UserInfo对象,UserInfo对象,]
  46. row = queryset[0]
  47. row.user
  48. row.pwd
  49. row.user_type -- user_type对象
  50. row.user_type.id
  51. row.user_type.caption
  52. ###### objects __
  53. ###### row.外键字段.外键表的字段
  54.  
  55. queryset = UserInfo.objects.filter(user_type__caption='普通用户').values('user', 'user_type__caption') -- 跨表使用双下划线
  56. [{'user':'alex','user_type__caption':'普通用户'},{'user':'eric','user_type__caption':'普通用户'}]
  57. row = queryset[0]
  58. row['user']
  59. row['user_type__caption']
  60.  
  61. 多张表
  62. class Something(models.Model):
  63. name = models.CharField(max_length=32)
  64.  
  65. class UserType(models.Model):
  66. caption = models.CharField(max_length=32)
  67. st = models.ForeignKey('Something')
  68. #超级管理员、普通用户、访客、黑客
  69.  
  70. class UserInfo(models.Model):
  71. user = models.CharField(max_length=32)
  72. pwd = models.CharField(max_length=32)
  73. user_type = models.ForeignKey('UserType')
  74. #user_type_id
  75.  
  76. UserInfo.objects.filter(user_type__st__name='xx')

Day19 Django之Form表单验证、CSRF、Cookie、Session和Model操作的更多相关文章

  1. python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)

    python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...

  2. Django 11 form表单(状态保持session、form表单及注册实现)

    Django 11 form表单(状态保持session.form表单及注册实现) 一.状态保持 session 状态保持 #1.http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状 ...

  3. web框架-(六)Django补充---form表单验证

    一.form表单验证 1. 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的 ...

  4. django之form表单验证

    django中的Form一般有两种功能: 输入html 验证用户输入 #!/usr/bin/env python # -*- coding:utf- -*- import re from django ...

  5. Django的Form表单验证

    Form(from django import forms) 简短理解:后端提供了一个类:from django import forms,继承此类定义子类.子类中定义和form表单中提交到name名 ...

  6. Django之form表单验证顺序

    概述 django框架提供了一个forms类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持. 验证过程 ...

  7. Django中的Form表单验证

    回忆一下Form表单验证的逻辑: 前端有若干个input输入框,将用户输入内容,以字典传递给后端. 后端预先存在一个Form表单验证的基类,封装了一个检测用户输入是否全部通过的方法.该方法会先定义好错 ...

  8. 6.4-6.5 使用form表单验证,完善登录页面

    之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...

  9. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

随机推荐

  1. DIV+CSS布局-固定页面开度布局

    DIV+CSS布局中主要CSS属性介绍: Float: Float属性是DIV+CSS布局中最基本也是最常用的属性,用于实现多列功能,我们知道<div>标签默认一行只能显示一个,而使用Fl ...

  2. Hibernate的集合映射(Set、List、Array、Map、Bag)

    POJOs如下: Customer类------>customer表   Order类对应---------->orders表  customer(1)<-------------- ...

  3. SOA是什么

    一.SOA是什么   SOA的全称是Service-Oriented Architecture,面向服务架构.是一种架构,不是一种具体的开发技术.   要真正理解什么是SOA需要从软件开发的技术发展史 ...

  4. Android-打反编译工具的一种方法

    转载请注明出处:http://blog.csdn.net/goldenfish1919/article/details/41010261 首先我们来看下dex文件的格式: class_defs的结构: ...

  5. C按格式输出数字

    看到有人问如何输出如下格式的字符: //1 6 10 13 15 //2 7 11 14 //3 8 12 //4 9 //5 于是写了一个,以后方便查看. main() { /* rows i j ...

  6. angularjs 根据变量改变 动态加载模板

    directive return { restrict: 'E', replace: true, templateUrl: 'app/view/order.html', link: function ...

  7. Oracle中not exists 与not in 的使用情况

    1.在oracle11g以上版本,oracle已经做了优化,能够自动将in优化成exists方式,因此oracle11g以上版本,使用in和exists效果是一样的. 2.在oracle中,使用not ...

  8. wordpress密码生成与登录密码验证

    一.研究wordpress时wordpess的密码密码生成与登录密码验证方式很重要 WordPress密码已成为整合的首要目标,如何征服整合,就得了解WordPress密码算法. WordPress系 ...

  9. struts启动报错Javassist library is missing

    很久不用struts2,最近在配置的时候,启动服务器报错 Caused by: java.lang.ExceptionInInitializerError at com.opensymphony.xw ...

  10. Android本地JUnit Text

    Android本地JUnit Text 步骤 创建一个和source文件,里面添加和src目录相同的包. 在AndroidManifest.xml文件manifest根节点添加如下文件 <ins ...