表单代码「建议收藏」

表单代码「建议收藏」django表单:在App中新建的form.py表单文件:视图文件:例1模板:例2模板:例2models.py:url映射:ModelForm在表单中使用 ModelFor

大家好,又见面了,我是你们的朋友全栈君。

django表单:

  1. 渲染表单模板。
  2. 表单验证数据是否合法。

 

在App中新建的form.py表单文件:

 1 from django import forms
 2 from django.core import validators
 3 from .models import User
 4 
 5 # 定义form表单,label:定义名字;error_messages:定义错误时内容的提示;(例1)
 6 class MesssageBoardForm(forms.Form):
 7     title = forms.CharField(max_length=10,min_length=2,label='标题',error_messages={'min_length':'最小不能少于两个字符','max_length':'不能超过十个字符'})
 8     content = forms.CharField(widget=forms.Textarea,label='内容',error_messages={'required':'必须传content字段'})
 9     email = forms.EmailField(label='邮箱',error_messages={'required':'必须传email字段'})
10     reply = forms.BooleanField(required=False,label='是否回复')
11 
12 # 可简化出错信息显示的内容,通用。
13 class BaseForm(forms.Form):
14     def get_errors(self):
15         errors = self.errors.get_json_data()
16         new_errors = {}
17         for key,message_dicts in errors.items():
18             messages = []
19             for message_dict in message_dicts:
20                 message = message_dict['message']
21                 messages.append(message)
22             new_errors[key] = messages
23         return new_errors
24 
25 # 进行注册信息的简单验证表单(例2)
26 class RegisterForm(BaseForm):
27     username = forms.CharField(max_length=20,min_length=2)
28     telephone = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}',message='请输入正确的手机号码!')])
29     pwd1 = forms.CharField(max_length=16,min_length=6,error_messages={'max_length':'不能超过十六个字符','min_length':'不能小于六个字符'})
30     pwd2 = forms.CharField(max_length=16,min_length=6,error_messages={'max_length':'不能超过十六个字符','min_length':'不能小于六个字符'})
31 
32     def clean_telephone(self):
33         telephone = self.cleaned_data.get('telephone')
34         exists = User.objects.filter(telephone=telephone).exists()
35         if exists:
36             raise forms.ValidationError(message="%s已经被注册"%telephone)
37         return telephone
38 
39     def clean(self):
40         cleaned_data = super().clean()
41         pwd1 = cleaned_data.get('pwd1')
42         pwd2 = cleaned_data.get('pwd2')
43         if pwd1 != pwd2:
44             raise forms.ValidationError(message='两次密码不一致!')

 

视图文件:

 1 from django.shortcuts import render
 2 from django.views.generic import View
 3 from .forms import MesssageBoardForm,RegisterForm
 4 from django.http import HttpResponse
 5 from .models import User
 6 
 7 # 简单的表格格式(例1)
 8 class IndexView(View):
 9     # 将form传给html模板来生成一个表单的html代码;
10     # 使用form生成的代码填写格式与验证不对时会先提示,不运行;
11     def get(self,request):
12         form = MesssageBoardForm()
13         return render(request,'index.html',context={'form':form})
14 
15     # post提交时,使用form.is_valid判断提交的内容与form中定义的是否一致;
16     # cleaned_data:获取相应数据;
17     def post(self,request):
18         form = MesssageBoardForm(request.POST)
19         if form.is_valid():
20             title = form.cleaned_data.get('title')
21             content = form.cleaned_data.get('content')
22             email = form.cleaned_data.get('email')
23             reply = form.cleaned_data.get('reply')
24             print(title)
25             print(content)
26             print(email)
27             print(reply)
28             return HttpResponse('success')
29         else:
30             # 打印出错的详细内容
31             print(form.errors.get_json_data())
32             return HttpResponse('Fail')
33 
34 # 注册信息的验证(例2)
35 class RegisterView(View):
36     # 返回注册页面模板;
37     # 不使用form的表单生成的代码,验证不对时仍会运行,没有预先提示;
38     def get(self,request):
39         return render(request,'register.html')
40 
41     # 提交注册的数据
42     def post(self,request):
43         form = RegisterForm(request.POST)
44         # 验证通过
45         if form.is_valid():
46             username = form.cleaned_data.get('username')
47             telephone = form.cleaned_data.get('telephone')
48             User.objects.create(username=username,telephone=telephone)
49             return HttpResponse('注册成功')
50         else:
51             print(form.errors.get_json_data())
52             # 调用了BaseFrom模板后简化的出错信息;
53             print(form.get_errors())
54             return HttpResponse('注册失败')

 

例1模板:

 1 {# 简单的index.html模板 #}
 2 <form action="" method="post">
 3     <table>
 4         {{ form.as_table }}
 5         <tr>
 6             <td></td>
 7             <td><input type="submit" value="提交"></td>
 8         </tr>
 9     </table>
10 </form>

 

例2模板:

 1 {# 注册验证的模板 register.html #}
 2 <form action="" method="post">
 3     <table>
 4         <tr>
 5             <td>用户:</td>
 6             <td><input type="text" name="username"></td>
 7         </tr>
 8         <tr>
 9             <td>电话:</td>
10             <td><input type="text" name="telephone"></td>
11         </tr>
12         <tr>
13             <td>密码:</td>
14             <td><input type="password" name="pwd1"></td>
15         </tr>
16         <tr>
17             <td>重复密码:</td>
18             <td><input type="password" name="pwd2"></td>
19         </tr>
20         <tr>
21             <td></td>
22             <td><input type="submit" value="提交"></td>
23         </tr>
24     </table>
25 </form>

 

例2 models.py:

1 from django.db import models
2 
3 class User(models.Model):
4     username = models.CharField(max_length=20)
5     telephone = models.CharField(max_length=11)

 

url映射:

1 urlpatterns = [
2     path('', views.IndexView.as_view()),
3     path('register/',views.RegisterView.as_view())

 

 

ModelForm

  在表单中使用 ModelForm ,定义一个 Meta 类,如在该类中指定 model=User ,以及 fields=__all__ ,等于将 User 模型中所有的字段都复制过来,进行验证。则不需要在表单中重复模型中已有的字段,减少代码。

models.py文件:

1 from django.db import models
2 from django.core import validators
3 
4 class User(models.Model):
5     username = models.CharField(max_length=100,validators=[validators.MinLengthValidator(2)])
6     password = models.CharField(max_length=16,validators=[validators.MinLengthValidator(6)])
7     telephone = models.CharField(max_length=11,validators=[validators.RegexValidator(r'1[345678]\d{9}')])

 

 

forms.py文件:

 1 from django import forms
 2 from .models import User
 3 
 4 # 注册信息的验证:
 5 class BaseForm(forms.ModelForm):
 6     # 验证手机号是否存在;
 7     def clean_telephone(self):
 8         telephone = self.cleaned_data.get('telephone')
 9         exists = User.objects.filter(telephone=telephone).exists()
10         if exists:
11             raise forms.ValidationError('%s手机号已存在' % telephone)
12         return telephone
13 
14     # 验证用户名;
15     def clean_username(self):
16         username = self.cleaned_data.get('username')
17         exists = User.objects.filter(username=username).exists()
18         if exists:
19             raise forms.ValidationError('%s:用户名已被注册' % username)
20         return username
21 
22     # 验证密码;
23     def clean(self):
24         cleaned_data = super().clean()
25         pwd1 = cleaned_data.get('pwd1')
26         pwd2 = cleaned_data.get('pwd2')
27         if pwd1 != pwd2:
28             raise forms.ValidationError('两次密码不一样')
29         else:
30             return cleaned_data
31 
32 # 定义一个Meta类;
33 class RegisterForm(BaseForm):
34     pwd1 = forms.CharField(max_length=16,min_length=6,error_messages={'min_length':'不能小于6字符','max_length':'不能大于16字符'})
35     pwd2 = forms.CharField(max_length=16,min_length=6,error_messages={'min_length':'不能小于6字符','max_length':'不能大于16字符'})
36 
37     class Meta:
38         model = User
39         # fields = ['username','telephone']   # 只提取某些字段;
40         # fields = '__all__'             # 复制所有的字段;
41         exclude = ['password']        # 排除某个字段;
42         # 使用“errors_messages”定义错误信息
43         error_messages = {
44             'username':{
45                 'max_length':'不能超过100字符',
46                 'min_length':'不能小于2字符'
47             },
48             'telephone':{
49                 'invalid':'请输入正确的手机号码'
50             }
51         }

 

 

views.py文件:

 1 from django.shortcuts import render
 2 from django.http import HttpResponse
 3 from .forms import RegisterForm
 4 from django.views.decorators.http import require_POST
 5 
 6 # 验证完成可直接调用save方法,“commit=False”:只生成模型而不插入到数据库中;
 7 @require_POST
 8 def register(request):
 9     form = RegisterForm(request.POST)
10     if form.is_valid():
11         user = form.save(commit=False)
12         user.password = form.cleaned_data.get('pwd1')
13         user.save()
14         return HttpResponse('success')
15     else:
16         print(form.errors.get_json_data())
17         return HttpResponse('Fail')

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154237.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电商项目数据库表的学习及数据库表结构设计

    电商项目数据库表的学习及数据库表结构设计数据库表知识的学习查阅了许多资料,也看了许多此类的文章与得到了老师的教导;总结出以下结论:表中的id字段不用加上表名,直接写id就好了。 表中一般不使用驼峰式命名,用“_”连接就好了,单词多的黏一起就好。 一般表中除了id字段还要存在以下基本字段 字段注释尽量要大写 表里一般写完id后是标题,再是关联的某个表id之类 当出现多对多关系时,就要做个处理不能直接两表关联;有两种方式:一是创建一个中间表;二是一个表id和需关联的表id常见的电商数据库表结构 横幅表(用于自动展示图片).

    2025年8月30日
    5
  • 【tensorflow】浅谈什么是张量tensor

    【tensorflow】浅谈什么是张量tensor也许你已经下载了TensorFlow,而且准备开始着手研究深度学习。但是你会疑惑:TensorFlow里面的Tensor,也就是“张量”,到底是个什么鬼?也许你查阅了维基百科,而且现在变得更加困惑。也许你在NASA教程中看到它,仍然不知道它在说些什么?问题在于大多数讲述张量的指南,都假设你已经掌握他们描述数学的所有术语。别担心!我像小孩子一样讨厌数学,所以如果我能明白,你也可以!…

    2022年6月25日
    31
  • python的random()函数用法_Python随机函数random用法示例

    python的random()函数用法_Python随机函数random用法示例这篇文章主要为大家详细介绍了Python随机函数random用法示例,具有一定的参考价值,可以用来参考一下。对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!在python中用于生成随机数的模块是random,在使用前需要import,下面看下它的用法。random.randomrandom.random()用于生成一个0到1的随机符点数:0b,则生成的…

    2022年5月29日
    35
  • does have any_has many

    does have any_has many使用京东云OSS的外链访问(自己程序拼的外链,并非是OSS服务器上给定的外链).访问报如下错误ThisXMLfiledoesnotappeartohaveanystyleinformationassociatedwithit.Thedocumenttreeisshownbelow.<Error> <statusCode>403</statusCode> <Code>AccessDenied</Code&g

    2026年1月16日
    4
  • Java虚拟机学习 – 垃圾收集器 (4)

    Java虚拟机学习 – 垃圾收集器 (4)

    2022年3月1日
    36
  • 解决项目中java heap space的问题[通俗易懂]

    解决项目中java heap space的问题[通俗易懂]起因 17年的一个项目出了OOM(javaheapspace)问题,眼下有个问题:法院项目,不能外网,一连接外网高院会直接定位到计算机,发出警报(档案的机密性啊)不能远程,那只能视频教他们怎么做了,全程和一个文员说代码,真的很累==! 过程 这个过程对一个不太了解内存的问题的开发无疑是艰难的,搜了一下,知道了是内存溢出导致的,于是着手解决 网上大多数都说调整运行…

    2022年7月8日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号