• Django高级之-forms组件


    Django高级之-forms组件

    1 校验字段功能

    针对一个实例:注册用户讲解。

    模型:models.py

    1. class UserInfo(models.Model):
    2. name=models.CharField(max_length=32)
    3. pwd=models.CharField(max_length=32)
    4. email=models.EmailField()

    模版文件

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <form action="" method="post">
    9. {% csrf_token %}
    10. <div>
    11. <label for="user">用户名</label>
    12. <p><input type="text" name="name" id="name"></p>
    13. </div>
    14. <div>
    15. <label for="pwd">密码</label>
    16. <p><input type="password" name="pwd" id="pwd"></p>
    17. </div>
    18. <div>
    19. <label for="r_pwd">确认密码</label>
    20. <p><input type="password" name="r_pwd" id="r_pwd"></p>
    21. </div>
    22. <div>
    23. <label for="email">邮箱</label>
    24. <p><input type="text" name="email" id="email"></p>
    25. </div>
    26. <input type="submit">
    27. </form>
    28. </body>
    29. </html>

    视图函数:

    1. # forms组件
    2. from django.forms import widgets
    3. wid_01=widgets.TextInput(attrs={"class":"form-control"})
    4. wid_02=widgets.PasswordInput(attrs={"class":"form-control"})
    5. class UserForm(forms.Form):
    6. name=forms.CharField(max_length=32,
    7. widget=wid_01
    8. )
    9. pwd=forms.CharField(max_length=32,widget=wid_02)
    10. r_pwd=forms.CharField(max_length=32,widget=wid_02)
    11. email=forms.EmailField(widget=wid_01)
    12. tel=forms.CharField(max_length=32,widget=wid_01)
    13. def register(request):
    14. if request.method=="POST":
    15. form=UserForm(request.POST)
    16. if form.is_valid():
    17. print(form.cleaned_data) # 所有干净的字段以及对应的值
    18. else:
    19. print(form.cleaned_data) #
    20. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
    21. print(form.errors.get("name")) # ErrorList ["错误信息",]
    22. return HttpResponse("OK")
    23. form=UserForm()
    24. return render(request,"register.html",locals())

    2 渲染标签功能

    渲染方式1

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    7. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    8. </head>
    9. <body>
    10. <h3>注册页面</h3>
    11. <div class="container">
    12. <div class="row">
    13. <div class="col-md-6 col-lg-offset-3">
    14. <form action="" method="post">
    15. {% csrf_token %}
    16. <div>
    17. <label for="">用户名</label>
    18. {{ form.name }}
    19. </div>
    20. <div>
    21. <label for="">密码</label>
    22. {{ form.pwd }}
    23. </div>
    24. <div>
    25. <label for="">确认密码</label>
    26. {{ form.r_pwd }}
    27. </div>
    28. <div>
    29. <label for=""> 邮箱</label>
    30. {{ form.email }}
    31. </div>
    32. <input type="submit" class="btn btn-default pull-right">
    33. </form>
    34. </div>
    35. </div>
    36. </div>
    37. </body>
    38. </html>

    渲染方式2

    1. <form action="" method="post">
    2. {% csrf_token %}
    3. {% for field in form %}
    4. <div>
    5. <label for="">{{ field.label }}</label>
    6. {{ field }}
    7. </div>
    8. {% endfor %}
    9. <input type="submit" class="btn btn-default pull-right">
    10. </form>

    渲染方式3

    1. <form action="" method="post">
    2. {% csrf_token %}
    3. {{ form.as_p }}
    4. <input type="submit" class="btn btn-default pull-right">
    5. </form>

    3 渲染错误信息功能

    视图

    1. def register(request):
    2. if request.method=="POST":
    3. form=UserForm(request.POST)
    4. if form.is_valid():
    5. print(form.cleaned_data) # 所有干净的字段以及对应的值
    6. else:
    7. print(form.cleaned_data) #
    8. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
    9. print(form.errors.get("name")) # ErrorList ["错误信息",]
    10. return render(request,"register.html",locals())
    11. form=UserForm()
    12. return render(request,"register.html",locals())

    模板

    1. <form action="" method="post" novalidate>
    2. {% csrf_token %}
    3. {% for field in form %}
    4. <div>
    5. <label for="">{{ field.label }}</label>
    6. {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span>
    7. </div>
    8. {% endfor %}
    9. <input type="submit" class="btn btn-default">
    10. </form>

    4 组件的参数配置

    1. class Ret(Form):
    2. name = forms.CharField(max_length=10, min_length=2, label='用户名',
    3. error_messages={'required': '该字段不能为空', 'invalid': '格式错误', 'max_length': '太长',
    4. 'min_length': '太短'},
    5. widget=widgets.TextInput(attrs={'class':'form-control'}))
    6. pwd = forms.CharField(max_length=10, min_length=2, widget=widgets.PasswordInput(attrs={'class':'form-control'}))
    7. email = forms.EmailField(label='邮箱', error_messages={'required': '该字段不能为空', 'invalid': '格式错误'})

    5 局部钩子

    1. from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
    2. def clean_name(self):
    3. val=self.cleaned_data.get("name")
    4. ret=UserInfo.objects.filter(name=val)
    5. if not ret:
    6. return val
    7. else:
    8. raise ValidationError("该用户已注册!")
    9. def clean_tel(self):
    10. val=self.cleaned_data.get("tel")
    11. if len(val)==11:
    12. return val
    13. else:
    14. raise ValidationError("手机号格式错误")

    6 全局钩子

    1. def clean(self):
    2. pwd=self.cleaned_data.get('pwd')
    3. r_pwd=self.cleaned_data.get('r_pwd')
    4. if pwd and r_pwd:
    5. if pwd==r_pwd:
    6. return self.cleaned_data
    7. else:
    8. raise ValidationError('两次密码不一致')
    9. else:
    10. return self.cleaned_data
    11. pwd_err=my_form.errors.get('__all__')
    12. from django import forms
    13. from django.forms import widgets
    14. from app01.models import UserInfo
    15. from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
    16. class UserForm(forms.Form):
    17. name=forms.CharField(min_length=4,label="用户名",error_messages={"required":"该字段不能为空"},
    18. widget=widgets.TextInput(attrs={"class":"form-control"})
    19. )
    20. pwd=forms.CharField(min_length=4,label="密码",
    21. widget=widgets.PasswordInput(attrs={"class":"form-control"})
    22. )
    23. r_pwd=forms.CharField(min_length=4,label="确认密码",error_messages={"required":"该字段不能为空"},widget=widgets.TextInput(attrs={"class":"form-control"}))
    24. email=forms.EmailField(label="邮箱",error_messages={"required":"该字段不能为空","invalid":"格式错误"},widget=widgets.TextInput(attrs={"class":"form-control"}))
    25. tel=forms.CharField(label="手机号",widget=widgets.TextInput(attrs={"class":"form-control"}))
    26. def clean_name(self):
    27. val=self.cleaned_data.get("name")
    28. ret=UserInfo.objects.filter(name=val)
    29. if not ret:
    30. return val
    31. else:
    32. raise ValidationError("该用户已注册!")
    33. def clean_tel(self):
    34. val=self.cleaned_data.get("tel")
    35. if len(val)==11:
    36. return val
    37. else:
    38. raise ValidationError("手机号格式错误")
    39. def clean(self):
    40. pwd=self.cleaned_data.get('pwd')
    41. r_pwd=self.cleaned_data.get('r_pwd')
    42. if pwd and r_pwd:
    43. if pwd==r_pwd:
    44. return self.cleaned_data
    45. else:
    46. raise ValidationError('两次密码不一致')
    47. else:
    48. return self.cleaned_data
    49. from django.shortcuts import render,HttpResponse
    50. from app01.myforms import *
    51. def reg(request):
    52. if request.method=="POST":
    53. print(request.POST)
    54. #form=UserForm({"name":"yu","email":"123@qq.com","xxxx":"alex"})
    55. form=UserForm(request.POST) # form表单的name属性值应该与forms组件字段名称一致
    56. print(form.is_valid()) # 返回布尔值
    57. if form.is_valid():
    58. print(form.cleaned_data) # {"name":"yuan","email":"123@qq.com"}
    59. else:
    60. print(form.cleaned_data) # {"email":"123@qq.com"}
    61. # print(form.errors) # {"name":[".........."]}
    62. # print(type(form.errors)) # ErrorDict
    63. # print(form.errors.get("name"))
    64. # print(type(form.errors.get("name"))) # ErrorList
    65. # print(form.errors.get("name")[0])
    66. # 全局钩子错误
    67. #print("error",form.errors.get("__all__")[0])
    68. errors=form.errors.get("__all__")
    69. return render(request,"reg.html",locals())
    70. '''
    71. form.is_valid() :返回布尔值
    72. form.cleaned_data :{"name":"yuan","email":"123@qq.com"}
    73. form.errors :{"name":[".........."]}
    74. '''
    75. form=UserForm()
    76. return render(request,"reg.html",locals())
    77. <!DOCTYPE html>
    78. <html lang="en">
    79. <head>
    80. <meta charset="UTF-8">
    81. <title>Title</title>
    82. <style>
    83. .error{
    84. color: red;
    85. }
    86. </style>
    87. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    88. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
    89. integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    90. </head>
    91. <body>
    92. <div class="container">
    93. <div class="row">
    94. <div class="col-md-6 col-lg-offset-3">
    95. {#<h3>简单form</h3>#}
    96. {##}
    97. {##}
    98. {#<form action="" method="post" novalidate>#}
    99. {# {% csrf_token %}#}
    100. {# <p>用户名<input type="text" name="name"></p>#}
    101. {# <p>密码 <input type="text" name="pwd"></p>#}
    102. {# <p>确认密码 <input type="text" name="r_pwd"></p>#}
    103. {# <p>邮箱 <input type="text" name="email"></p>#}
    104. {# <p>手机号 <input type="text" name="tel"></p>#}
    105. {# <input type="submit">#}
    106. {##}
    107. {#</form>#}
    108. <hr>
    109. <h3>forms组件渲染方式1</h3>
    110. <form action="" method="post" novalidate>
    111. {% csrf_token %}
    112. <p>{{ form.name.label }}
    113. {{ form.name }} <span class="pull-right error">{{ form.name.errors.0 }}</span>
    114. </p>
    115. <p>{{ form.pwd.label }}
    116. {{ form.pwd }} <span class="pull-right error">{{ form.pwd.errors.0 }}</span>
    117. </p>
    118. <p>确认密码
    119. {{ form.r_pwd }} <span class="pull-right error">{{ form.r_pwd.errors.0 }}</span><span class="pull-right error">{{ errors.0 }}</span>
    120. </p>
    121. <p>邮箱 {{ form.email }} <span class="pull-right error">{{ form.email.errors.0 }}</span></p>
    122. <p>手机号 {{ form.tel }} <span class="pull-right error">{{ form.tel.errors.0 }}</span></p>
    123. <input type="submit">
    124. </form>
    125. {#<h3>forms组件渲染方式2</h3>#}
    126. {##}
    127. {#<form action="" method="post" novalidate>#}
    128. {# {% csrf_token %}#}
    129. {##}
    130. {# {% for field in form %}#}
    131. {##}
    132. {# <div>#}
    133. {# <label for="">{{ field.label }}</label>#}
    134. {# {{ field }}#}
    135. {# </div>#}
    136. {##}
    137. {# {% endfor %}#}
    138. {##}
    139. {# <input type="submit">#}
    140. {#</form>#}
    141. {##}
    142. {#<h3>forms组件渲染方式3</h3>#}
    143. {##}
    144. {#<form action="" method="post">#}
    145. {# {% csrf_token %}#}
    146. {##}
    147. {# {{ form.as_p }}#}
    148. {##}
    149. {# <input type="submit">#}
    150. {#</form>#}
    151. </div>
    152. </div>
    153. </div>
    154. </body>
    155. </html>

             

  • 相关阅读:
    网络-跨域解决
    leetcode/复原 IP
    关于对 DeferWindowPos 的理解
    setContentView源码解析
    Visual Studio Code 常用快捷键大全
    根据输入类型来选择函数不同的实现方法functools.singledispatch
    前端自学需要把大量时间放在 HTML、CSS 吗?
    Django(1)概述
    Python Qt UI设计
    src与href的区别?
  • 原文地址:https://blog.csdn.net/Renweif/article/details/136546030