一、Form

form.py

  1. from django import forms
  2. from django.core.exceptions import ValidationError
  3. from django.contrib.auth.models import User
  4. import re
  5.  
  6. # 定义手机号验证规则
  7. def phone_validate(value):
  8. phone = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
  9. if not phone.match(value):
  10. raise ValidationError("手机号格式错误")
  11.  
  12. class RegForm(forms.Form):
  13. username = forms.CharField(
  14. label="用户名",
  15. min_length=6,
  16. initial="请输入用户名",
  17. error_messages={
  18. 'required': "不能为空",
  19. "invalid": "格式错误",
  20. "min_length": "用户名最短6位"
  21. },
  22. widget=forms.widgets.TextInput(attrs={"class": "form-control"})
  23. )
  24.  
  25. password = forms.CharField(
  26. label="密码",
  27. min_length=8,
  28. widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
  29. error_messages={
  30. "required": "不能为空",
  31. "min_length": "不能少于8位"
  32. }
  33. )
  34.  
  35. re_password = forms.CharField(
  36. label="密码",
  37. min_length=8,
  38. widget=forms.widgets.PasswordInput(attrs={"class": "form-control"}, render_value=True),
  39. error_messages={
  40. "required": "不能为空",
  41. "min_length": "不能少于8位"
  42. }
  43. )
  44.  
  45. email = forms.EmailField(
  46. label="邮箱",
  47. widget=forms.widgets.TextInput(attrs={"class": "form-control"}),
  48. error_messages={
  49. 'required': "不能为空",
  50. "invalid": "格式错误",
  51. }
  52. )
  53.  
  54. # radio
  55. gender = forms.fields.ChoiceField(
  56. choices=((1,"男"),(0,"女"),),
  57. label="性别",
  58. initial=1,
  59. widget=forms.widgets.RadioSelect()
  60. )
  61.  
  62. # 单选select
  63. se_hobby = forms.fields.ChoiceField(
  64. label="select单选爱好",
  65. choices=((1,"篮球"),(2,"网球"),(3,"羽毛球"),),
  66. # initial=1,
  67. widget=forms.widgets.Select()
  68. )
  69.  
  70. # 多选select
  71. se_hobbys = forms.fields.MultipleChoiceField(
  72. label="select多选爱好",
  73. choices=((1, "篮球"), (2, "网球"), (3, "羽毛球"),),
  74. initial=[1,],
  75. widget=forms.widgets.SelectMultiple()
  76. )
  77.  
  78. # 单选checkbox
  79. keep_username = forms.fields.ChoiceField(
  80. label="记住用户名",
  81. # initial="checked",
  82. widget=forms.widgets.CheckboxInput()
  83. )
  84.  
  85. # 多选checkbox
  86. ch_hobbys = forms.fields.MultipleChoiceField(
  87. label="checkbox多选爱好",
  88. choices=((1, "篮球"), (2, "网球"), (3, "羽毛球"),),
  89. # initial=[1, 2],
  90. widget=forms.widgets.CheckboxSelectMultiple()
  91. )
  92.  
  93. # 手机号
  94. phone = forms.fields.CharField(
  95. validators=[phone_validate, ],
  96. error_messages={
  97. "required": "手机不能为空"
  98. },
  99. widget=forms.widgets.TextInput(attrs={"class": "form-control"})
  100. )
  101.  
  102. # # 批量增加样式
  103. # def __init__(self, *args, **kwargs):
  104. # super(RegForm, self).__init__(*args, **kwargs)
  105. # for field in iter(self.fields):
  106. # self.fields[field].widget.attrs.update({
  107. # 'class': 'form-control'
  108. # })
  109. #
  110. # # 动态获取数据库的choice数据
  111. # self.fields["gender"].choices = User.objects.all().values_list("id", "gender")
  112.  
  113. # 重写全局的钩子函数,对确认密码做校验
  114. def clean(self):
  115. password = self.cleaned_data.get("password")
  116. re_password = self.cleaned_data.get("re_password")
  117. if re_password and re_password != password:
  118. self.add_error("re_password", ValidationError("两次输入的密码不一致"))
  119. else:
  120. return self.cleaned_data
  121.  
  122. # 定义局部钩子,验证用户名是否被注册
  123. def clean_username(self):
  124. username = self.cleaned_data.get("username")
  125. is_exist = User.objects.filter(username=username)
  126. if is_exist:
  127. self.add_error("username", ValidationError("用户名已被注册"))
  128. else:
  129. return username
  130.  
  131. # 定义局部钩子,验证邮箱是否可用
  132. def clean_email(self):
  133. email = self.cleaned_data.get("email")
  134. is_exist = User.objects.filter(email=email)
  135. if is_exist:
  136. self.add_error("email", ValidationError("邮箱不可用"))
  137. else:
  138. return email

view.py

  1. def reg(request):
  2. form_obj = RegForm()
  3. if request.method == "POST":
  4. ret = {"status": 0, "msg": ""}
  5. form_obj = RegForm(request.POST)
  6. if form_obj.is_valid():
  7. # form_obj.cleaned_data.pop("re_password")
  8. # print(form_obj.cleaned_data)
  9. # User.objects.create_user(**form_obj.cleaned_data)
  10. ret["msg"] = "/login"
  11. return JsonResponse(ret)
  12. else:
  13. # print(form_obj.errors)
  14. ret["status"] = 1
  15. ret["msg"] = form_obj.errors
  16. return JsonResponse(ret)
  17. return render(request, 'register.html', {"forms_obj": form_obj})

register.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <meta http-equiv='Content-type' content='text/htm'>
  7. <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
  8. <script src="/static/jquery-3.3.1.js"></script>
  9. <script src="/static/bootstrap/js/bootstrap.min.js"></script>
  10. </head>
  11. <body>
  12. <div class="container">
  13. <div class="row">
  14. <div class="col-md-6 col-md-offset-3 reg-form">
  15. <h3 class="text-center">Register</h3><br>
  16. <form class="form-horizontal" novalidate method="post"
  17. enctype="multipart/form-data">
  18. {% csrf_token %}
  19. <div class="form-group ">
  20. <label for='{{ forms_obj.username.id_for_label }}'
  21. class="col-sm-2 control-label">{{ forms_obj.username.label }}</label>
  22. <div class="col-sm-8">
  23. {{ forms_obj.username }}
  24. <span class="help-block">{{ forms_obj.username.errors.0 }}</span>
  25. <span id="ss" class="help-block"></span>
  26. </div>
  27. </div>
  28.  
  29. <div class="form-group ">
  30. <label for='{{ forms_obj.password.id_for_label }}'
  31. class="col-sm-2 control-label">{{ forms_obj.password.label }}</label>
  32. <div class="col-sm-8">
  33. {{ forms_obj.password }}
  34. <span class="help-block">{{ forms_obj.password.errors.0 }}</span>
  35. </div>
  36. </div>
  37.  
  38. <div class="form-group ">
  39. <label for='{{ forms_obj.re_password.id_for_label }}'
  40. class="col-sm-2 control-label">{{ forms_obj.re_password.label }}</label>
  41. <div class="col-sm-8">
  42. {{ forms_obj.re_password }}
  43. <span class="help-block">{{ forms_obj.re_password.errors.0 }}</span>
  44. </div>
  45. </div>
  46.  
  47. <div class="form-group">
  48. <label for="{{ forms_obj.email.id_for_label }}"
  49. class="col-sm-2 control-label">{{ forms_obj.email.label }}</label>
  50. <div class="col-sm-8">
  51. {{ forms_obj.email }}
  52. <span class="help-block">{{ forms_obj.email.errors.0 }}</span>
  53. </div>
  54. </div>
  55.  
  56. <div class="form-group">
  57. <label for="{{ forms_obj.gender.id_for_label }}"
  58. class="col-sm-2 control-label">{{ forms_obj.gender.label }}</label>
  59. <div class="col-sm-8">
  60. {{ forms_obj.gender }}
  61. <span class="help-block">{{ forms_obj.gender.errors.0 }}</span>
  62. </div>
  63. </div>
  64.  
  65. <div class="form-group">
  66. <label for="{{ forms_obj.se_hobby.id_for_label }}"
  67. class="col-sm-2 control-label">{{ forms_obj.se_hobby.label }}</label>
  68. <div class="col-sm-8">
  69. {{ forms_obj.se_hobby }}
  70. <span class="help-block">{{ forms_obj.se_hobby.errors.0 }}</span>
  71. </div>
  72. </div>
  73.  
  74. <div class="form-group">
  75. <label for="{{ forms_obj.se_hobbys.id_for_label }}"
  76. class="col-sm-2 control-label">{{ forms_obj.se_hobbys.label }}</label>
  77. <div class="col-sm-8">
  78. {{ forms_obj.se_hobbys }}
  79. <span class="help-block">{{ forms_obj.se_hobbys.errors.0 }}</span>
  80. </div>
  81. </div>
  82.  
  83. <div class="form-group">
  84. <label for="{{ forms_obj.keep_username.id_for_label }}"
  85. class="col-sm-2 control-label">{{ forms_obj.keep_username.label }}</label>
  86. <div class="col-sm-8">
  87. {{ forms_obj.keep_username }}
  88. <span class="help-block">{{ forms_obj.keep_username.errors.0 }}</span>
  89. </div>
  90. </div>
  91.  
  92. <div class="form-group">
  93. <label for="{{ forms_obj.ch_hobbys.id_for_label }}"
  94. class="col-sm-2 control-label">{{ forms_obj.ch_hobbys.label }}</label>
  95. <div class="col-sm-8">
  96. {{ forms_obj.ch_hobbys }}
  97. <span class="help-block">{{ forms_obj.ch_hobbys.errors.0 }}</span>
  98. </div>
  99. </div>
  100.  
  101. <div class="form-group">
  102. <label for="{{ forms_obj.phone.id_for_label }}"
  103. class="col-sm-2 control-label">{{ forms_obj.phone.label }}</label>
  104. <div class="col-sm-8">
  105. {{ forms_obj.phone }}
  106. <span class="help-block">{{ forms_obj.phone.errors.0 }}</span>
  107. </div>
  108. </div>
  109.  
  110. <div class="form-group">
  111. <div class="col-sm-offset-3 col-sm-6">
  112. <button id="reg_submit" type="button" class="btn btn-success btn-block">注册</button>
  113. </div>
  114. </div>
  115. </form>
  116. </div>
  117. </div>
  118. </div>
  119.  
  120. <script>
  121. $("#reg_submit").click(function () {
  122. var formData = new FormData();
  123. formData.append("username", $("#id_username").val());
  124. formData.append("password", $("#id_password").val());
  125. formData.append("re_password", $("#id_re_password").val());
  126. formData.append("gender", $("input[name='gender']:checked").val());
  127. formData.append("se_hobby", $("#id_se_hobby").val());
  128. formData.append("se_hobbys", $("#id_se_hobbys").val());
  129. formData.append("keep_username", $("#id_keep_username").prop("checked"));
  130. formData.append("ch_hobbys", $("#id_ch_hobbys input[name='ch_hobbys']:checked").val());
  131. formData.append("phone", $("#id_phone").val());
  132. formData.append("csrfmiddlewaretoken", $("input[name='csrfmiddlewaretoken']").val());
  133. $.ajax({
  134. url:'/register/',
  135. type:'post',
  136. processData: false,
  137. contentType: false,
  138. data:formData,
  139. }).done(function (data) {
  140. if (data.status){
  141. $.each(data.msg,function (k,v) {
  142. $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error")
  143. })
  144. }
  145. else {
  146. window.location.href = data.msg
  147. }
  148. })
  149. });
  150.  
  151. $("form input").focus(function () {
  152. $(this).next("span").text("").parent().parent().removeClass("has-error");
  153. });
  154. $("form select").focus(function () {
  155. $(this).next("span").text("").parent().parent().removeClass("has-error");
  156. });
  157. $("form input[name='ch_hobbys']").focus(function () {
  158. $(this).parents("ul").next("span").text("").parent().parent().removeClass("has-error");
  159. })
  160. </script>
  161. </body>
  162. </html>

二、ModelForm

form.py

  1. from booktest.models import *
  2. from django.forms import widgets as wds
  3.  
  4. class BookForm(forms.ModelForm):
  5. class Meta:
  6. model = BookInfo
  7. fields = "__all__"
  8. labels = {
  9. "btitle": "书名",
  10. "bpub_date": "发布日期",
  11. "bcomment": "评论量",
  12. "bread": "阅读量"
  13. }
  14.  
  15. widgets = {
  16. "btitle": wds.TextInput(attrs={"class": "form-control"}),
  17. "bpub_date": wds.TextInput(attrs={"class": "form-control", "type": "date"}),
  18. "bread": wds.TextInput(attrs={"class": "form-control"}),
  19. "bcomment": wds.TextInput(attrs={"class": "form-control"})
  20. }
  21.  
  22. error_messages = {
  23. "btitle": {"required":"不能为空",},
  24. "bpub_date": {"required":"不能为空",},
  25. "bcomment": {"required":"不能为空",},
  26. "bread": {"required":"不能为空",}
  27. }

view.py(add_book)

  1. def add_book(request):
  2. form_obj = BookForm()
  3. if request.method == "POST":
  4. ret = {"status": 0, "msg": ""}
  5. form_obj = BookForm(data=request.POST)
  6. if form_obj.is_valid():
  7. print(form_obj.cleaned_data)
  8. form_obj.save()
  9. ret["msg"] = '/bookform'
  10. return JsonResponse(ret)
  11. else:
  12. ret["status"] = 1
  13. ret["msg"] = form_obj.errors
  14. return JsonResponse(ret)
  15. return render(request, 'add_book.html', {"forms_obj": form_obj})

add_book.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <meta http-equiv='Content-type' content='text/htm'>
  7. <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
  8. <script src="/static/jquery-3.3.1.js"></script>
  9. <script src="/static/bootstrap/js/bootstrap.min.js"></script>
  10. </head>
  11. <body>
  12. <div class="container">
  13. <div class="row">
  14. <div class="col-md-6 col-md-offset-3 reg-form">
  15. <h3 class="text-center"></h3><br>
  16. <form class="form-horizontal" novalidate method="post"
  17. enctype="multipart/form-data">
  18. {% csrf_token %}
  19. <div class="form-group ">
  20. <label for='{{ forms_obj.btitle.id_for_label }}'
  21. class="col-sm-2 control-label">{{ forms_obj.btitle.label }}</label>
  22. <div class="col-sm-8">
  23. {{ forms_obj.btitle }}
  24. <span class="help-block">{{ forms_obj.btitle.errors.0 }}</span>
  25. <span id="ss" class="help-block"></span>
  26. </div>
  27. </div>
  28.  
  29. <div class="form-group ">
  30. <label for='{{ forms_obj.bpub_date.id_for_label }}'
  31. class="col-sm-2 control-label">{{ forms_obj.bpub_date.label }}</label>
  32. <div class="col-sm-8">
  33. {{ forms_obj.bpub_date }}
  34. <span class="help-block">{{ forms_obj.bpub_date.errors.0 }}</span>
  35. </div>
  36. </div>
  37.  
  38. <div class="form-group ">
  39. <label for='{{ forms_obj.bcomment.id_for_label }}'
  40. class="col-sm-2 control-label">{{ forms_obj.bcomment.label }}</label>
  41. <div class="col-sm-8">
  42. {{ forms_obj.bcomment }}
  43. <span class="help-block">{{ forms_obj.bcomment.errors.0 }}</span>
  44. </div>
  45. </div>
  46.  
  47. <div class="form-group">
  48. <label for="{{ forms_obj.bread.id_for_label }}"
  49. class="col-sm-2 control-label">{{ forms_obj.bread.label }}</label>
  50. <div class="col-sm-8">
  51. {{ forms_obj.bread }}
  52. <span class="help-block">{{ forms_obj.bread.errors.0 }}</span>
  53. </div>
  54. </div>
  55.  
  56. <div class="form-group">
  57. <div class="col-sm-offset-3 col-sm-6">
  58. <button id="reg_submit" type="button" class="btn btn-success btn-block">注册</button>
  59. </div>
  60. </div>
  61. </form>
  62. </div>
  63. </div>
  64. </div>
  65.  
  66. <script>
  67. $("#reg_submit").click(function () {
  68. var formData = new FormData();
  69. formData.append("btitle", $("#id_btitle").val());
  70. formData.append("bpub_date", $("#id_bpub_date").val());
  71. formData.append("bcomment", $("#id_bcomment").val());
  72. formData.append("bread", $("#id_bread").val());
  73. formData.append("csrfmiddlewaretoken", $("input[name='csrfmiddlewaretoken']").val());
  74. $.ajax({
  75. url:'/bookform/',
  76. type:'post',
  77. processData: false,
  78. contentType: false,
  79. data:formData,
  80. }).done(function (data) {
  81. if (data.status){
  82. $.each(data.msg,function (k,v) {
  83. $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error")
  84. })
  85. }
  86. else {
  87. window.location.href = data.msg
  88. }
  89. })
  90. });
  91.  
  92. $("form input").focus(function () {
  93. $(this).next("span").text("").parent().parent().removeClass("has-error");
  94. });
  95. </script>
  96. </body>
  97. </html>

view.py(edit_book)

  1. def editbook(request, book_id):
  2. edit_book = BookInfo.objects.get(id=book_id)
  3. if request.method == "POST":
  4. form_obj = BookForm(request.POST, instance=edit_book)
  5. if form_obj.is_valid():
  6. form_obj.save() # edit_book.update(request.POST)
  7. return redirect('/add_book')
  8. else:
  9. form_obj = BookForm(instance=edit_book)
  10. return render(request, 'edit_book.html', locals())

edit_book.html

  1. <body>
  2. <form method="post">
  3. {% csrf_token %}
  4. {% for field in form_obj %}
  5. <div>
  6. {{ field.label }}
  7. {{ field }}<span>{{ field.errors.0 }}</span>
  8. </div>
  9. {% endfor %}
  10. <input type="submit">
  11. </form>
  12.  
  13. </body>

Django—Form、ModelForm的更多相关文章

  1. Django之Form、ModelForm 组件

    Django之Form.ModelForm 组件 一.Form组件: django框架提供了一个form类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此 ...

  2. Django之Model、Form、ModelForm区别

    本节内容: 1:Model               https://www.cnblogs.com/shuai1991/p/10844662.html 2:Form                 ...

  3. Model、Form、ModelForm的比较

    Model.Form.ModelForm 本节内容: 1:Model 2:Form 3:Model Form 1 2 3 http://www.cnblogs.com/wupeiqi/articles ...

  4. Django 中的Form、ModelForm

    一.ModelForm 源码 class ModelForm(BaseModelForm, metaclass=ModelFormMetaclass): pass def modelform_fact ...

  5. python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    一.model深入 1.model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2.创建数据库表的单表操作 2.1 定义表对象 class xxx(models.M ...

  6. Django Form and Modelform Admin定义 高级查询)

    Django的form表单一般具有两种功能 1. 验证输入 2.输入HTML ---------模板----------- from django import forms class BookFor ...

  7. Django Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  8. Django - Form和ModelForm

    [TOC] 一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 ...

  9. Django Form and ModelForm

    Form介绍 在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输 ...

随机推荐

  1. 内部yum仓库制作

    有些安装收到网络隔离(申请一个到DMZ区的通行证很困难) 使用yum的命令工具,在有网络环境下同步我们的yum仓库,并用http服务器代理和制作repo源进行内部安装. 实操: [root@maste ...

  2. Fedora 24系统基本命令

    Fedora  24基本命令 一.     DNF软件管理 1.        修改配置:在/etc/dnf/dnf.conf中加入fastestmirror=true.keepcache=true ...

  3. 入坑MATLAB必会的吐血总结

    本渣想回过头来整理一下MATLAB的一些基本的知识(很多东西比较琐碎,应该系统的梳理梳理),下文中没有提到的,自己用help查即可. 此文用来存个档,便于回顾. 由于matlab各版本部分语法存在差异 ...

  4. 洛谷P4643 [国家集训队]阿狸和桃子的游戏(思维题+贪心)

    思维题,好题 把每条边的边权平分到这条边的两个顶点上,之后就是个sb贪心了 正确性证明: 如果一条边的两个顶点被一个人选了,一整条边的贡献就凑齐了 如果分别被两个人选了,一作差就抵消了,相当于谁都没有 ...

  5. 【洛谷P3649】回文串

    题目大意:给定一个长度为 N 的字符串,定义一个变量为该字符串的回文子串长度乘以该字串出现的次数,求这个变量的最大值是多少. 题解:学会了回文自动机. 回文自动机是两棵树组成的森林结构,并通过 fai ...

  6. 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

    转载声明:本文为转载文章,发表于nebulaf91的csdn博客.欢迎转载,但请务必保留本信息,注明文章出处. 原文作者: nebulaf91 原文原始地址:http://blog.csdn.net/ ...

  7. git最基础操作一

    1. 从远端克隆:git clone -b 克隆的分支 git的地址( eg:git clone -b master https://gitee.com/test/test.git ) 2.提交修改的 ...

  8. freetype之PC机体验

    目录 freetype之PC机体验 引入 中文教程 官方教程 代码结构 字体概念 PC上安装 官方例子 宽字符保存显示中文 坐标框架体系 字符坐标信息获取 title: freetype之PC机体验 ...

  9. TCP/IP详解(包含ack,seq)

    前言 个人认为在web开发中,对于TCP/IP协议的理解是首当其冲的,在大多数框架的冲击下,使我们淡化了对于TCP/IP协议的理解. 理解好TCP/IP对于每个web开发者都是很有必要的. TCP/I ...

  10. C语言 内存管理(转)

     转自 https://blog.csdn.net/u011616739/article/details/61621815 C语言 内存管理 1.内存分区 C源代码进过预处理.编译.汇编和链接4步生成 ...