Django基础之Form
生活随笔
收集整理的這篇文章主要介紹了
Django基础之Form
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.可能用到的模塊:
1 from django.shortcuts import render,redirect,HttpResponse 2 from django.forms import Form #Form模塊 3 from django.forms import fields 4 from django.forms import widgets 5 from app01 import models 6 from django.core.exceptions import ValidationError #自定義驗證規(guī)則,拋出異常2.Form類的創(chuàng)建:
1 class StudentInfo(Form): 2 sname = fields.CharField(max_length=6,min_length=2) 3 email = fields.EmailField(min_length=3) 4 age = fields.IntegerField(min_value=0,max_value=100) #數字限制只有大小沒有長度 5 cls_id = fields.IntegerField(widget=widgets.Select) 6 #widget部件可以自定制from插件,如select,radio等 7 8 #當字段限制來自一個表,需要對__init__方法里的self.fields對應的字段值在每次實例化時重新查詢值,保持數據的同步,即表內容增加,這里的限制內容也增加。 9 def __init__(self,*args,**kwargs): 10 super(StudentInfo,self).__init__(*args,**kwargs)#注意:如上面的cls_id 為 fields.MultipleChoiceField(widget=widgets.SelectMultiple),諸如此類多選,則self.felds[].widget
需要去掉,直接為self.felds[].choices.....
11 self.fields['cls_id'].widget.choices = models.Classes.objects.values_list('id','title')
3.應用:
1 #Django 后端: 2 3 def add_student(request): 4 if request.method == 'GET': 5 obj = StudentInfo() #實例化類,獲得類的全部字段并傳到前端 6 return render(request, 'add_student.html',{'obj':obj}) 7 8 else: 9 obj = StudentInfo(request.POST) #將post拿到的數據傳入類中驗證 10 if obj.is_valid(): 11 #如果根據規(guī)則驗證成功,拿到的數據如果字段名與數據表完全一致可以直接添加 12 models.Student.objects.create(**obj.cleaned_data) 13 return redirect('/student.html') 14 #驗證失敗,數據再返回,根據obj.errors.字段名可以拿到錯誤信息,此時用戶填寫的數據還會顯示在頁面上。 15 return render(request,'add_student.html',{'obj':obj}) 16 17 #models: 18 from django.db import models 19 20 # Create your models here. 21 class Classes(models.Model): 22 title = models.CharField(max_length=16) 23 24 class Student(models.Model): 25 sname = models.CharField(max_length=32) 26 email = models.EmailField(max_length=32) 27 age = models.IntegerField() 28 cls = models.ForeignKey('Classes') 29 30 class Teacher(models.Model): 31 tname = models.CharField(max_length=32) 32 t2c = models.ManyToManyField('Classes') 33 34 35 #前端: 36 <!DOCTYPE html> 37 <html lang="en"> 38 <head> 39 <meta charset="UTF-8"> 40 <title>Title</title> 41 </head> 42 <body> 43 <form action="/add_teacher.html" method="POST" novalidate> 44 {% csrf_token %} 45 <p>姓名:{{ obj.tname }}{{ obj.errors.tname.0 }}</p> 46 <p>任教班級:{{ obj.t2c}}{{ obj.errors.t2c.0 }}</p> 47 <input type="submit" value="提交"> 48 </form> 49 </body> 50 </html> 51 52 form簡單應用 form簡單應用?4.自定制驗證規(guī)則:
1 - is_valid 2 - 字段 = 默認正則表達式 3 - 額外的正則 4 from django.forms import Form 5 from django.forms import widgets 6 from django.forms import fields 7 from django.core.validators import RegexValidator 8 9 class MyForm(Form): 10 user = fields.CharField( 11 validators=[RegexValidator(r'^[0-9]+$', '請輸入數字'), RegexValidator(r'^159[0-9]+$', '數字必須以159開頭')], 12 ) 13 14 15 - clean_字段,必須返回值 16 def clean_user(self): 17 v = self.cleaned_data['user'] 18 if models.UserInfo.objects.filter(user=v).count(): 19 #判斷獲取到的user在數據庫已經存在,主動拋出異常,內部捕獲到異常則將異常添加到obj.errors里。 20 raise ValidationError('用戶名已經存在') 21 return self.cleaned_data['user'] 22 23 - clean() 24 有返回值:cleaned_data = 返回值 25 無返回值:cleaned_data = 原來的值 擴展功能?5.文件上傳:
?實現form表單獲取用戶上傳的文件
1 #Django常規(guī)方法處理文件上傳 2 def f1(request): 3 if request.method == "GET": 4 return render(request,'f1.html') 5 else: 6 import os 7 # request.POST 8 file_obj = request.FILES.get('fafafa') #取文件時,需以FILES獲取文件數據 9 f = open(os.path.join('static',file_obj.name),'wb') #寫字節(jié)方式打開空文件,拼接文件路徑 10 for chunk in file_obj.chunks(): #Django文件處理有.chuanks()方法,一塊一塊的讀數據 11 f.write(chunk) #同時寫入本地空文件 12 f.close() #寫入完成關閉文件 13 return render(request,'f1.html') 14 15 #定制Form方法處理文件上傳 16 class F2Form(Form): 17 user = fields.CharField() 18 fafafa = fields.FileField() #對應的字段FileField() 19 20 def f2(request): 21 if request.method == "GET": 22 obj = F2Form() 23 return render(request,'f2.html',{'obj':obj}) 24 else: 25 # 獲取form表單提交的數據,文本數據用POST獲取,文件用FILES 26 obj = F2Form(data=request.POST,files=request.FILES) 27 if obj.is_valid(): 28 print(obj.cleaned_data.get('fafafa').name) #.name 文件名 29 print(obj.cleaned_data.get('fafafa').size) #.size 文件大小 30 return render(request,'f2.html',{'obj':obj}) form后端代碼 1 #f1.html: 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title></title> 7 </head> 8 <body> 9 #當form中有文件需要接收時,需添加屬性 enctype="multipart/form-data" 10 <form method="POST" action="/f1/" enctype="multipart/form-data"> 11 {% csrf_token %} 12 <input type="text" name="user" /> 13 <input type="file" name="fafafa" /> 14 <input type="submit" value="提交" /> 15 </form> 16 </body> 17 </html> 18 19 #f2.html 20 <!DOCTYPE html> 21 <html lang="en"> 22 <head> 23 <meta charset="UTF-8"> 24 <title></title> 25 </head> 26 <body> 27 <form method="POST" action="/f2/" enctype="multipart/form-data"> 28 {% csrf_token %} 29 30 {{ obj.user }} 31 {{ obj.fafafa }} 32 33 <input type="submit" value="提交" /> 34 </form> 35 </body> 36 </html> form前端代碼?
轉載于:https://www.cnblogs.com/mitsui/p/7122217.html
總結
以上是生活随笔為你收集整理的Django基础之Form的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: for语句 2017-03-17
- 下一篇: 只有设置了 name 属性的表单元素才能