Django之forms.Form


django中的form組件提供了普通表單提交及驗證數據的主要功能:

1.    生成頁面可用的HTML標簽

2.    對用戶提交的數據進行驗證

3.    可保留用戶上次提交的數據

  

django中使用form組件

(一)在py文件(可以是視圖,也可新建后在視圖引入使用)創建一個form組件類,必須繼承forms.Form(fromdjangoimportforms)

1.    類中定義的字段都可在模板中渲染成相應的HTML表單標簽

class Inform(forms.Form):

name=forms.CharField()

#CharField類實例化的字段渲染后是type='text'input標簽(實例化參數可以改變type類型)

 

     password=forms.CharField()

 

2.    類中定義的字段根據實例化該字段的類生成不同的標簽

class Inform(forms.Form):

    name=forms.CharField()

 

password = forms.CharField( 

# 字段對象的類的實例化通過插件widget修改生成的HTML標簽,attrs可以設置多個屬性  

    # widget=forms.TextInput(attrs={'type': 'password'}),

    widget=forms.PasswordInput(render_value=True),#插件(設置保存密碼)

)

 

3.    類中定義的字段的類的實例化可以設置相應的參數進行配置

class Inform(forms.Form):

    name = forms.CharField(

    # required=True,  # 默認為True

    min_length=2,#最小長度

    max_length=6,#最大長度

    initial='張三'# 默認值

    help_text='長度為26個字符!'# 幫助信息

    error_messages=[{  #自定義錯誤提示信息(默認為英文)

        'required':'不能為空!',

        'min_length':'不能少於2個字符!'·

    }],

    validators=[],#自定義校驗規則(列表中放自定義函數名,或者引入django內置的RegexValidator校驗器)

    # disabled=True#默認為True顯示

)

 

    password = forms.CharField(

    # widget=forms.TextInput(attrs={'type': 'password'}),

    widget=forms.PasswordInput(),

)

 

(二)在相應的視圖函數中實例化該類之后,當成模板變量通過render進行模板渲染時自定義form組件中的字段都會以標簽顯示

 

views.py

 1 from django.shortcuts import render,HttpResponse
 2 from django import forms
 3 from app01 import models
 4 from django.core.validators import RegexValidator
 5 import re
 6 from django.core.exceptions import ValidationError
 7  
 8 #自定義校驗函數,直接在字段validators中使用
 9 def name_valid(value):
10     name_re=re.compile(r'^[a-zA-Z_]+$')
11     if not name_re.match(value):
12         raise ValidationError("只能以字母下划線開頭!")
13  
14 class Myform(forms.Form):
15     name = forms.CharField(
16         # required=True,  # 默認為True
17         min_length=2,
18         max_length=6,
19         initial='abc',  # 默認值
20         help_text='長度為2到6個字符!',  # 幫助信息
21         error_messages=[{  # 自定義錯誤提示信息(默認為英文)
22             'required': '不能為空!',
23             'min_length': '不能少於2個字符!'
24         }],
25         validators=[RegexValidator(r'^(\w)+$','用戶名只能有字母數字下划線組成!'), name_valid],  # 自定義校驗規則(列表中放自定義函數名,或者引入django內置的RegexValidator校驗器)
26         # disabled=True#默認為True顯示
27      )
28      # 密文
29     password = forms.CharField(
30         widget=forms.TextInput(attrs={'type': 'password'}),
31     )
32     # 日期
33     birth = forms.DateField(
34         widget=forms.TextInput(attrs={'type': 'date'})
35     )
36     # 單選
37     sex = forms.ChoiceField(
38         choices=[('0', ''), ('1', '')],
39         # widget=forms.Select()#下拉單選(默認)
40         # widget=forms.RadioSelect()#正常單選
41  
42         # widget = forms.CheckboxInput()#記住賬號密碼(label='記住賬號密碼',initial='checked',choices=[('True',1),('False',0)])
43     )
44  
45     publish = forms.ModelChoiceField(
46         queryset=models.Publish.objects.all()  # 只能用all結果才能正常顯示,必須設置__str__,否則拿到是對象
47         # widget和ChoiceFiled一樣設置
48     )
49     # 多選
50     hobby = forms.MultipleChoiceField(
51  
52         choices=[('1', 'wan '), ('2', 'ee')],
53         # widget=forms.SelectMultiple()#下拉多選(默認)
54         # widget=forms.CheckboxSelectMultiple()#正常多選
55     )
56     author = forms.ModelMultipleChoiceField(
57         queryset=models.Author.objects.all()  # 只能用all結果才能正常顯示,必須設置__str__,否則拿到是對象
58         # widget和MultipleChoiceField一樣設置
59     )
60  
61     def __init__(self,*args,**kwargs):#初始化對字段進行樣式設置
62         super().__init__(*args,**kwargs)
63          for filed in self.fields:
64             self.fields[filed].widget.attrs.update({'class':'form-control'})
65   
66 def form(request):
67     if request.method=='GET':
68         form_obj=Myform()
69         return  render(request, 'form.html', {'form_obj':form_obj})
70     else:
71         form_obj=Myform(request.POST)#對提交的數據進行組件類實例化
72         if form_obj.is_valid():#校驗提交的數據對象(字段校驗-->validators校驗(RegexValidator模塊或者自定義函數)-->局部鈎子-->全局鈎子)
73             print(form_obj.cleaned_data)#form_obj.clean_data已經校驗完的所有值
74             return HttpResponse('ok')
75         else:
76             return render(request,'form.html',{'form_obj':form_obj})#檢測到錯誤,刷新頁面,保留原數據
views.py

form.html

 1 {% load static %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
 7     <title>form</title>
 8 </head>
 9 <body>
10 <div class="container">
11     <div class="row">
12         <div class="col-xs-8 col-xs-offset-2">
13             <h2>注冊信息表:</h2>
14             {% for field in form_obj %}
15                 <p>
16                 
17 <label for="{{ field.id_for_label }}">{{ field.label }}</label>
18 {{ field }}
19 <span class="text-danger">{{ field.errors.0 }}</span> 
20                 </p>
21             {% endfor %} 
22         </div>
23     </div>
24 </div>
25 </body>
26 <script src="{% static 'jquery-3.4.1.js' %}"></script>
27 <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
28 </html>
form.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM