整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          ASP.NET Web Forms-HTML 表單

          有的服務器控件都必須出現在 <form> 標簽中,<form> 標簽必須包含 runat="server" 屬性。


          ASP.NET Web 表單

          所有的服務器控件都必須出現在 <form> 標簽中,<form> 標簽必須包含 runat="server" 屬性。runat="server" 屬性表明該表單必須在服務器上進行處理。同時也表明了包含在它內部的控件可被服務器腳本訪問:

          <form runat="server">

          ...HTML + server controls

          </form>

          注釋:該表單總是被提交到自身頁面。如果您指定了一個 action 屬性,它會被忽略。如果您省略了 metion 屬性,它將會默認設置 method="post"。同時,如果您沒有指定 name 和 id 屬性,它們會由 ASP.NET 自動分配。

          注釋:一個 .aspx 頁面只能包含一個 <form runat="server"> 控件!

          如果您在一個包含不帶有 name、method、action 或 id 屬性的表單的 .aspx 頁面中選擇查看源代碼,您會看到 ASP.NET 添加這些屬性到表單上了,如下所示:

          <form name="_ctl0" method="post" action="page.aspx" id="_ctl0">

          ...some code

          </form>


          提交表單

          表單通常通過點擊按鈕來提交。ASP.NET 中的 Button 服務器控件的格式如下:

          <asp:Button id="id" text="label" OnClick="sub" runat="server" />

          id 屬性為按鈕定義了一個唯一的名稱,text 屬性為按鈕分配了一個標簽。onClick 事件句柄規定了一個要執行的已命名的子例程。

          在下面的實例中,我們在 .aspx 文件中聲明了一個 Button 控件。點擊按鈕運行改變按鈕上文本的子例程:

          實例

          章來源于公眾號【Python野路子】


          HTML表單是網站交互性的經典方式,本章將記錄如何用Django對用戶提交的表單數據進行處理。

          HTML中的表單

          站在前端角度,form表單HTML中用于提交數據給服務器的一個標簽,所有的表單元素(input/textarea/button...)都要放在form標簽當中,還有以下參數:

          • formmethod參數用于設置表單的提交方式,默認使用GET
          • action用于設置表單的提交url,如果不寫或者保持空字符串,那么將使用當前的URL,建議盡量指定一個url,因為有些瀏覽器可能兼容問題,不填是不能獲取到對應的action的。

          Django中的表單

          Django中的表單不是html中的那個表單,這里是指Django中的組件名叫表單,主要做以下2件事:

          1)表單驗證數據的合法性。

          2)通渲染表單模板;

          Form

          Form類在from django import forms中,使用時需要定義一個Form的子類,相當于將請求的表單數據封裝到一個特殊的類中,并自動完成一些數據的驗證工作。

          Form基本使用

          1)先在某個應用app下,新建一個forms.py的文件(類似前面學過的views.pyurls.py在對應app應用下)。

          2)在里面定義一個表單類,繼承自django.forms.Form

           from django import forms 
          

          3)在表單類中,創建字段與模型類類似,但是沒有null=True(是否接受空值NULL,默認值False)或者blank=True(是否接受空白內容,默認為False)等這幾種參數了,有的參數是required=True/False(請求能否為空,True不能為空,默認為True)。

          from django import forms
          
          class RegisterForm(forms.Form):
              # label屬性是form表單中特有的屬性,代表這個字段的描述,這個屬性類似于模型類中的verbose_name屬性
              username = forms.CharField(label=u'用戶名', max_length=20, min_length=3)
              # 存儲到數據庫的密碼,是一個加密后的字符串,但是這里是通過前端傳輸過來的,并沒進行加密
              password = forms.CharField(label=u'密碼', max_length=20, min_length=8)
          

          4)表單生成HTML表單元素。

          # views.py
          
          class RegisterView(View):
              def get(self, request):
                  # 如果需要使用django表單渲染html頁面
                  # 實例化該表單模型,傳遞給前端
                  form = RegisterForm()
                  return render(request, 'register_form.html', {'form': form})
          
              def post(self, request):
                  # 如果不使用django表單,需要一個一個的值取出來,并且需要自己寫對應的驗證
                  username = request.POST.get('username')
                  password = request.POST.get('password')
                  return render(request, 'register_form.html', locals())
          
          <!-- register_form.html -->
          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>Title</title>
          </head>
          <body>
              {% if username %}
                  提交的post數據:
                  {{ username }}
                  {{ password }}
              {% else %}
                  <form action = "{% url "user:register" %}" method="post">
                      {% csrf_token %}
                      {{ form }}  <!--會自動識別表單屬性的 -->
                      <input type="submit" vlaue='注冊'>
                  </form>
              {% endif %}
          </body>
          </html>
          




          注意:使用DjangoForm類生成的表單,不包含formsubmit按鈕兩個標簽,需要手動添加。

          一般用于生成HTML表單元素很少使用,尤其在現在前后分離趨勢下,這個功能很雞肋,把前端該做的事情放到后臺來實現,增加了代碼的耦合性,也增加了服務器的壓力。

          我們一般使用forms組件的校驗功能,比如賬號長度必須6~12位,密碼長度必須為8~20位,且必須含大小寫字母,我們可以一個個獲取前端傳過來的字段進行一個個校驗,如果字段比較多,如果一個個單獨校驗,那比較繁瑣,那我們可以使用django提供的forms組件,我們先來看個簡單的。

          # forms.py
          '''
          forms.py的作用
          它是專門編寫你的forms配置的模型
          forms.py本身命名沒有要求,你可以為任意名稱, 但是我們一般約定它叫forms,代表這個文件是專門處理該APP下處理表單組件的
          '''
          from django import forms
          
          class RegisterForm(forms.Form):
              username = forms.CharField(max_length=20, min_length=3)
              password = forms.CharField(max_length=20, min_length=8)
          
          # views.py
          
          class RegisterView(View):
              def get(self, request):
                  # 如果需要使用django表單渲染html頁面
                  # 實例化該表單模型,傳遞給前端
                  form = RegisterForm()
                  return render(request, 'register_form.html', {'form': form})
          
              def post(self, request):
                  # 滿足Form里面
                  form = RegisterForm({'username': 'admin', 'password': '12345678'})
                  print(form.is_valid())  # True
                  print(form.cleaned_data)  # {'username': 'admin', 'password': '12345678'},輸出全部校驗正確的字段
                  print(form.errors)
          
                  # 其中一個不滿足,例如密碼長度少于8
                  form = RegisterForm({'username': 'admin', 'password': '12345'})
                  print(form.is_valid())  # False
                  print(form.cleaned_data)  #  {'username': 'admin'}, 輸出校驗正確的字段
                  print(form.errors)
                  '''
                  <ul class="errorlist">
                      <li>password
                          <ul class="errorlist">
                              <li>Ensure this value has at least 8 characters (it has 5).</li>
                          </ul>
                      </li>
                  </ul>
                  '''
                  print(type(form.errors))  # <class 'django.forms.utils.ErrorDict'>
                  print(form['password'].errors)
                  # <ul class="errorlist"><li>Ensure this value has at least 8 characters (it has 5).</li></ul>
                  print(form.errors.get('password'))
                  # <ul class="errorlist"><li>Ensure this value has at least 8 characters (it has 5).</li></ul>
                  print(form.errors.get_json_data())
                  # {'password': [{'message': 'Ensure this value has at least 8 characters (it has 5).', 'code': 'min_length'}]}
          
          
                  # 比Form少一個字段
                  form = RegisterForm({'username': 'admin'})
                  print(form.is_valid())  # False
                  print(form.cleaned_data)  # {'username': 'admin'}
                  print(form.errors)
                  '''
                  <ul class="errorlist">
                      <li>password
                          <ul class="errorlist">
                              <li>This field is required.</li>
                          </ul>
                      </li>
                  </ul>        
                  '''
                  print(form.errors.get('password'))
                  # <ul class="errorlist"><li>This field is required.</li></ul>
                  
                  print(form.errors.get_json_data())
                  # {'password': [{'message': 'This field is required.', 'code': 'required'}]}
          
          
                  # 比Form多一個字段,例如多個age
                  form = RegisterForm({'username': 'admin', 'password': '12345678', 'age': 18})
                  print(form.is_valid())  # True
                  print(form.cleaned_data)  # {'username': 'admin', 'password': '12345678'}, 比Form多的字段不輸出
                  print(form.errors)
          
                  return render(request, 'register_form.html', locals())
          

          我們這里先傳幾個固定的參數來進行測試,通過上面測試,我們可以總結下。

          1)使用is_valid()方法可以驗證用戶提交的數據是否合法,這個方法會返回一個bool值,合法則返回True,否則返回False。其中在實例化一個form對象時,傳的參數必須與Form里面定義的字段:

          • 傳的字段名一樣;
          • 字段值必須滿足Form里面的校驗規則;
          • 傳的參數個數 等于或大于 Form定義的個數。

          2)cleaned_data()獲取滿足Form校驗規則的字段, 使用cleaned_data必須執行完is_valid()方法。

          3)如果表單校驗沒有通過,form對象則會產生一個errors屬性,這個屬性包括所有的驗證錯誤信息。我們可以獲取錯誤信息傳遞給前端。

          • form.errors:這個屬性獲取的錯誤信息是一個包含html標簽的錯誤信息。
          • 通過form['屬性名'].errosform.errors.get('屬性名')訪問對應的錯誤。
          • 通過form.errors.get_json_data()form['屬性名'].erros.get_json_data()可以將錯誤消息轉換成JSON數據。
          • 默認的錯誤信息是英文不夠人性化,我們可以通過在Field中添加一個error_messagesdict類型的參數,然后根據屬性名設置對應的message,例如以下代碼:password = forms.CharField(label=u'密碼', max_length=20, min_length=8, error_messages={'required':u'密碼不能為空'})

          必須要執行完is_valid函數,否則errors是不會包含錯誤。

          常用Field字段

          在表單中,創建字段跟模型是一模一樣的,但是沒有null=True(是否接受空值NULL,默認值False)或者blank=True(是否接受空白內容,默認為False)等這幾種參數了,有的參數是required=True/False(請求能否為空,True不能為空,默認為True)。

          使用Field可以是對數據驗證的第一步。你期望這個提交上來的數據是什么類型,那么就使用什么類型的Field

          CharField

          用來接收文本。參數:

          • max_length:這個字段值的最大長度。
          • min_length:這個字段值的最小長度。
          • required:這個字段是否是必須的。默認是True,必須的。
          • error_messages:字段驗證失敗時給出的錯誤提示信息,需要傳入一個字典,字典中需要指定對應驗證條件的錯誤提示信息,如error_messages={'max_length': '最多只能有100個字符!'}表示指定文本最大長度不滿足時給出提示信息。

          EmailField

          用來接收郵件,會自動驗證郵箱格式是否合法。錯誤信息的key:requiredinvalid

          FloatField

          用來接收浮點類型,并且如果驗證通過后,會將這個字段的值轉換為浮點類型。參數:

          • max_value:最大的值。
          • min_value:最小的值。

          錯誤信息的key:requiredinvalidmax_valuemin_value

          IntegerField

          用來接收整形,并且驗證通過后,會將這個字段的值轉換為整形。參數:

          • max_value:最大的值。
          • min_value:最小的值。

          錯誤信息的key:requiredinvalidmax_valuemin_value

          URLField

          用來接收url格式的字符串。錯誤信息的key:requiredinvalid

          FileField

          用來接收文件,allow_empty_file=False是否允許空文件。

          ImageField

          接收圖片,注意需要PIL模塊,pip3 install Pillow,以上2個字典使用時,需要注意2點:

          • form表單中enctype="multipart/form-data"
          • view函數中my_form= MyForm(request.POST, request.FILES)

          驗證器

          Form類中的各個Field字段其實都有一些基本的驗證器,如果表單中的某個字段想要額外添加一些驗證功能,可以指定validators參數給字段添加一些驗證器,或者給這個字段定義一個額外的形如clean_[字段名]自定義驗證方法。

          內置驗證器

          內置驗證器通過字段的validators參數指定對應的驗證器列表即可,Django內置的驗證器都在django.core.validators中,常用的內置驗證器:

          • MaxValueValidator:最大值。
          • MinValueValidator:最小值。
          • MaxLengthValidator:最大長度。
          • MinLengthValidator:最小長度。
          • EmailValidator:是否為郵箱格式。
          • URLValidator:是否為url格式。
          • RegexValidator:是否符合正則表達式,使用時傳入一個正則表達式即可。
          • FileExtensionValidator:驗證文件名后綴是否符合要求,使用時傳入一個文件名后綴的列表,如['txt', 'csv'],表示只允許上傳這些類型的文件。

          自定義驗證

          系統自帶表單校驗規則,有時無法滿足我們的需求,比如在注冊的表單驗證中,我們需要驗證用戶是否已經被注冊過了,那么這個時候就需要去數據庫查詢判斷才知道,這個時候我們可以對某個字段,進行自定義的驗證。

          需要針對某個字段進行特殊驗證時,可以在Form表單類中定義一個clean_[字段名]的方法,就會自動執行這個方法進行驗證了,如果不符合要求,直接拋出異常即可,符合要求則返回對應的值。如果想要針對多個字段之間的驗證,可以重寫clean()方法,當所有字段的驗證都通過后就會執行這個方法。

          # form.py
          
          from django import forms
          from .models import Account
          
          class RegisterForm(forms.Form):
              # label 屬性是form表單中特有的屬性,代表這個字段的描述,這個屬性類似于模型類中的verbose_name屬性
              username = forms.CharField(label=u'用戶名', min_length=3, max_length=18,
                                         error_messages={'required': u'用戶名不能為空',
                                                         'min_length': u'用戶名不少于3位',
                                                         'max_length': u'用戶名不超過18位'
                                                         })
          
              password = forms.CharField(label=u'密碼', required=True, min_length=6, max_length=16,
                                         error_messages={'required': u'密碼不能為空', 'min_length': u'密碼不少于6位',
                                                         'max_length': u'密碼不超過16位'})
              confirm_pwd = forms.CharField(label=u'確認密碼', min_length=6, max_length=16,
                                            error_messages={'required': u'確認密碼不能為空', 'min_length': u'密碼不少于6位',
                                                         'max_length': u'密碼不超過16位'})
              # 可以不填
              email = forms.EmailField(label=u'郵箱', required=False)  # required 請求能否為空,True不能為空,默認為True
          
              # 表單自定義錯誤消息:重寫方法clean_field(field是一個屬性名),可以自定義針對某一個field的驗證機制,一個屬性一個對應方法
              # clean() 或者 clean_xxx() 會在執行 form.is_valid() 的過程中被調用
              def clean_username(self):
                  # 當字段的基本驗證通過后,會將數據存儲在cleaned_data中
                  username = self.cleaned_data['username']
                  if Account.objects.filter(username=username).exists():
                      # 如果這里判斷有多個錯誤存在,則使用add_error方法。
                      self.add_error('username', '該用戶名已使用,請重新選擇!')
                      # 如果只是單個錯誤,使用ValidationError,否則這里raise拋出去了,后面就不能執行了
                      #raise forms.ValidationError('用戶已存在')
          
                  # 敏感詞匯
                  if username.find('mmp') >= 0:
                      self.add_error('username', '存在敏感字符')
                      
            # 需要返回處理后的值
                  return username
          
              def clean_confirm_pwd(self):  #不能用clean_password,因為加載這個時候,confirm_pwd還沒加載出來,是沒有值的。
                  pwd = self.cleaned_data['password']
                  confirm_pwd = self.cleaned_data['confirm_pwd']
          
                  if pwd != confirm_pwd:
                      raise forms.ValidationError('兩次密碼不一致', code='')
          
                  return pwd
              
              def clean(self):
                  # 執行這個方法時表示所有字段都已驗證成功,當然,需要先調用父類的clean()方法
                  cleaned_data = super().clean()
                  # 當字段的基本驗證通過后,會將數據存儲在cleaned_data中
                  # 獲取需要驗證的字段
                  
                  ...
                  # 需要返回處理后的值
                  return cleaned_data      
          
              def get_error_dict(self):
                  # 提取錯誤信息
                  if hasattr(self, 'errors'): #hasattr() 函數用于判斷對象是否包含對應的屬性。
                      errors = self.errors.get_json_data()
                      print(type(errors)) # <class 'dict'>
                      print(errors)
                      # {'username': [{'message': '用戶名不能為空', 'code': 'required'}],
                      # 'password': [{'message': '密碼不能為空', 'code': 'required'}],
                      # 'confirm_pwd': [{'message': '確認密碼不能為空', 'code': 'required'}]}
          
                      err_msg_dict = {}
                      for key, message in errors.items():
                          print(key, message) # username [{'message': '用戶名不能為空', 'code': 'required'}]
                          msg_list = []
                          for msg in message:
                              print(msg) # {'message': '用戶名不能為空', 'code': 'required'}
                              msg_list.append(msg['message'])
          
                          err_msg_dict[key] = msg_list
          
                      print(err_msg_dict)  # {'username': ['用戶名不能為空'], 'password': ['密碼不能為空'], 'confirm_pwd': ['確認密碼不能為空']}
          
                      return err_msg_dict
          
                  return None
          
          
              def get_error_str(self):
                  # 提取錯誤信息
                  if hasattr(self, 'errors'): #hasattr() 函數用于判斷對象是否包含對應的屬性。
                      errors = self.errors.get_json_data().values()  # 獲取字典值部分
                      print(errors)
                      #dict_values([[{'message': '用戶名不能為空', 'code': 'required'}],
                      # [{'message': '密碼不能為空', 'code': 'required'}], [{'message': '確認密碼不能為空', 'code': 'required'}]])
          
                      err_msg_list = []
                      for itme in errors:
                          print(itme) # [{'message': '用戶名不能為空', 'code': 'required'}]
          
                          err_msg_list.append(itme[0].get('message'))
          
                      print(err_msg_list) # ['用戶名不能為空', '密碼不能為空', '確認密碼不能為空']
          
                      err_msg_str = ';'.join(err_msg_list)  # 將錯誤信息通過;拼接成字符串
          
                      print(err_msg_str)  # 用戶名不能為空;密碼不能為空;確認密碼不能為空
          
                      return err_msg_str
          
                  return None
          

          視圖views.py

          class RegisterView(View):
              def get(self, request):
                  # 如果需要使用django表單渲染html頁面
                  # 實例化該表單模型,傳遞給前端
                  return render(request, 'register_form.html')
          
              def post(self, request):
                  print(request.POST) #<QueryDict: {'username': ['admin'], 'password': ['6666'], 'confirm_pwd': ['222'], 'email': ['']}>
          
                  register_form = RegisterForm(request.POST)
          
                  if register_form.is_valid():
                      # 使用cleaned_data 必須執行完is_valid 且返回為True才能獲取數據,保存用戶提交上來的數據
                      print(register_form.cleaned_data)
                      username = register_form.cleaned_data['username']
                      password = register_form.cleaned_data['password']
          
                      # 利用字典解包方式
                      params = {'username': username, 'password': password}
                      Account.objects.create(**params)
          
                      return HttpResponse('注冊成功')
          
                  else:
                      print(register_form.errors)
                      # <ul class="errorlist"><li>username<ul class="errorlist"><li>用戶名不能為空</li></ul></li></ul>
                      print(register_form.errors.get_json_data())
                      # {'username': [{'message': '用戶名不能為空', 'code': 'required'}]}
          
                      print(register_form.errors.get('username'))  # <ul class="errorlist"><li>用戶名不能為空</li></ul>
          
                      print(register_form.errors.get('username').get_json_data()) # [{'message': '用戶名不能為空', 'code': 'required'}]
          
                      err_msg_dict = register_form.get_error_dict()
                      # {'username': ['用戶名不能為空'], 'password': ['密碼不能為空'], 'confirm_pwd': ['確認密碼不能為空']}
          
                      return render(request, 'register_form.html', err_msg_dict)
          
          

          模板register_form.html

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>Title</title>
          </head>
          <body>
          <form action="{% url "user:register" %}" method="post">
              用戶名:<input type="text" name="username"><span>{{ username.0 }}</span>
              密  碼:<input type="password" name="password"><span>{{ password.0 }}</span>
              確認密碼:<input type="password" name="confirm_pwd"><span>{{ confirm_pwd.0 }}</span>
              郵  箱:<input type="email" name="email">
          
              <input type="submit" vlaue='注冊'>
          </form>
          </body>
          </html>
          

          自定義錯誤信息,可以通過在定義表單類是設置相關屬性,校驗不通過則會報默認錯誤。我們可以通過設置error_messages字典來設置對應message。也可以自定義錯誤信息。

          不管那種必須要執行完is_valid函數,否則執行相關errors是不會包含錯誤,form類的運行順序是initcleanvalidtesave,如果遇到類似錯誤,比如說不能為空,最大最小長度時,在error_messages寫了錯誤信息,也自定義了表單錯誤信息,則required=True時調用error_message,否則自定義的。

          ModelForm

          通過上面我們發現,Form表單中的字段與模型中的字段基本是一模一樣的,表單中需要驗證的數據,也就是模型中需要保存的,我們可以將模型中的字段與表單中的字段進行綁定,例如上面RegisterForm改成繼承forms.ModelForm

          # models.py
          class Account(models.Model):
              username = models.CharField(max_length=16)
              password = models.CharField(max_length=20)
          
              class Meta:
                  db_table = 'tb_account'
          
              def __str__(self):
                  return self.username
              
          # forms.py
          class RegisterForm(forms.ModelForm):
              """
                1.補充 Model 沒有的 Field 到表單,例如這里的confirm_pwd
                2.覆蓋 Model 中的 Field 定義
              """
              confirm_pwd = forms.CharField(label=u'確認密碼', min_length=6, max_length=16,
                                            error_messages={'required': u'確認密碼不能為空',                                   'min_length': u'密碼不少于6位', 'max_length': u'密碼不超過16位'})
          
              class Meta:
                  model = Account  # 對應model中的類
                  fields = '__all__'  # 說明要關聯類中的哪些字段,默認__all__關聯所有字段,如果不需要全部
                  # exclude = ['avatar']  # 排除字段
                  error_messages = {  # 自定義錯誤信息
                      'username': {
                          'max_length': '用戶名長度不超過16位',
                          'required': "用戶名不能為空",
                      },
                      'password': {
                          'max_length': '用戶名長度不超過16位',
                          'required': "用戶名不能為空",
                      }
                  }
          
              def clean_confirm_pwd(self): 
                  pwd = self.cleaned_data['password']
                  confirm_pwd = self.cleaned_data['confirm_pwd']
          
                  if pwd != confirm_pwd:
                      raise forms.ValidationError('兩次密碼不一致', code='')
          
                  return pwd
          
              
          # views.py
          from .forms import RegisterForm
          
          from hashlib import md5
          
          class RegisterView(View):
              def get(self, request):
                  # 如果需要使用django表單渲染html頁面
                  # 實例化該表單模型,傳遞給前端
                  return render(request, 'register_form.html')
          
              def post(self, request):
                  print(request.POST)
          
                  register_form = RegisterForm(request.POST)
          
                  if register_form.is_valid():
                      # 使用cleaned_data 必須執行完is_valid 且返回為True才能獲取數據,保存用戶提交上來的數據
                      print(register_form.cleaned_data)
                      # {'username': 'admin666', 'password': '1q2w3e4r', 'confirm_pwd': '1q2w3e4r'}
          
                      register_form.save()  # 這里save即使多了個confirm_pwd沒關系,是按照model字段來的。
          
                      return HttpResponse('注冊成功')
          
                  else:
                      print(register_form.errors.get_json_data())
                      #{'username': [{'message': '用戶名不能為空', 'code': 'required'}],
                      # 'password': [{'message': '用戶名不能為空', 'code': 'required'}],
                      # 'confirm_pwd': [{'message': '確認密碼不能為空', 'code': 'required'}]}
          
                      print(register_form.errors.get('username').get_json_data())  # [{'message': '用戶名不能為空', 'code': 'required'}]
          
                      return render(request, 'register_form.html')
          

          RegisterForm是繼承自forms.ModelForm,然后在表單中定義了一個Meta類,在Meta類中指定了model=Account,以及fields="__all__",這樣就可以將Account模型中所有的字段都復制過來,進行驗證。如果只想針對其中幾個字段進行驗證,那么可以給fields指定一個列表,將需要的字段寫進去。

          如果要驗證的字段比較多,只是除了少數幾個字段不需要驗證,那么可以使用exclude來代替fields

          與普通的Form表單驗證類型類似,ModelForm表單的驗證在調用is_valid()或訪問errors屬性時隱式調用。

          驗證時,可以在ORM模型的字段定義中指定validators參數,添加額外的驗證器即可。

          自定義錯誤,因為字段都不是在表單中定義的,而是在模型中定義的,因此一些錯誤消息無法在字段中定義。那么這時候可以在Meta類中,定義error_messages,然后把相應的錯誤消息寫到里面去。

          自定義校驗規則與Form表單一樣。

          save保存,ModelForm還有save方法,可以在驗證完成后直接調用save方法,就可以將這個數據保存到數據庫中了。這個方法必須要在clean沒有問題后才能使用,如果在clean之前使用,會拋出異常。另外,我們在調用save方法的時候,如果傳入一個commit=False,那么只會生成這個模型的對象,而不會把這個對象真正的插入到數據庫中。比如表單上驗證的字段沒有包含模型中所有的字段,這時候就可以先創建對象,再根據填充其他字段,把所有字段的值都補充完成后,再保存到數據庫中,例如:

          form = MyForm(request.POST)
          if form.is_valid():
              article = form.save(commit=False)
              article.category = 'Python'
              article.save()
              return HttpResponse('succes')
          else:
              print(form.get_errors())
              return HttpResponse('fail')
          

          并且即使form的數據比model模型字段多也沒關系。

          ModelForm的子類可以接受現有的模型實例作為關鍵字參數instance;如果提供此功能,則save()將更新該實例。如果沒有提供,save() 將創建模型的一個新實例。

          # 修改表數據是,記得把instance信息也傳進去,不然是新建數據,而不是對某行數據進行修改。
          article_form = ArticleAddForm(dict_data, instance=article)  # 指定給誰做修改
          if article_form.is_valid():
              article_form.save()
              return json_status.result(message='文章更新成功')
          


          #Django#

          文章來源于公眾號【Python野路子】

          TML作為一種用來描述網頁的語言,是制作網頁必不可少的,但HTML 不是一種編程語言,而是一種標記語言 (markup language),本著為了更好的了解大數據開發的基礎,今天就帶著大家更進一步的了解HTML的使用,HTML的表格與表單。



          1.HTML表格

          表格由 <table> 標簽來定義。每個表格均有若干行(由 <tr> 標簽定義),每行被分割為若干單元格(由 <td> 標簽定義)。字母 td 指表格數據(table data),即數據單元格的內容。數據單元格可以包含文本、圖片、列表、段落、表單、水平線、表格等等。表格的作用就不言而喻了,讓看起來更簡潔直觀有序性。

          下面給大家帶來一些常用的標簽:

          <table> 表格的最外層容器

          <tr> 定義表格行

          <th> 定義表頭

          <td> 定義表格單元

          <caption>定義表格表題

            <width>:寬度。可以用像素或百分比表示。 常用960像素。

            <border>:邊框,常用值為0。

            <cellpadding>:內容跟邊框的距離,常用值為0。

            <cellspacing>:單元格與單元格之間的間距,常用值為0。

            <algin>:對齊方式。

            <bgcolor>:背景色。

          <background>:背景圖片。

          <align>: 一行內容的水平對齊方式。

          <valign>: 一行內容的垂直對齊方式。

          <height>:行高。

          創建表格

          在HTML網頁中,要想創建表格,就需要使用表格相關的標簽。



          創建表格的基本語法:

          <table>

          <tr>

          <td>單元格內的文字</td>

          ...

          </tr>

          ...

          </table>

          舉個例子



          其中:table用于定義一個表格標簽。

          tr標簽 用于定義表格中的行,必須嵌套在 table標簽中。

          td 用于定義表格中的單元格,必須嵌套在<tr></tr>標簽中。

          字母 td 指表格數據(table data),即數據單元格的內容。

          再比如說我們可以建立個有顏色的格子,如下圖



          表格的作用除了可以顯示一個表格外,有的時候還可以用于輔助排版。但現在都不怎么使用了,因為時代的進步,以前的表格排版的網頁已經被淘汰了。



          2. HTML表單

          關于表單的制定,因為在瀏覽器中輸入的內容都必須要經過網絡提交到服務器端再處理,所以需要把所有的控件都包含在一個form表單控件中,然后一次提交給服務器,再由服務器處理用戶提交的數據。

          HTML 支持有序列表(有序列表是一列項目,列表項目使用數字進行標記。


          有序列表始于 <ol> 標簽。每個列表項始于 <li> 標簽。)無序列表(無序列表也是一個項目的列表,此列項目使用粗體圓點“典型的小黑圓圈“進行標記。)和定義列表(自定義列表不僅僅是一列項目,而是項目及其注釋的組合。自定義列表以 <dl> 標簽開始。每個自定義列表項以 <dt> 開始。每個自定義列表項的定義以 <dd> 開始。)。

          表單常用標簽:

          form: 表單的最外層容器

          input: 用于搜集用戶信息,根據不同的type屬性值,展示不同的控件

          Text:普通的文本輸入框

          Password:密碼輸入框

          Checkbox:復選框

          Radio:單選框

          File:上傳文件

          Submit:提交按鈕

          Reset:重置按鈕

          Cols:列

          Rows:行

          注意事項:

          <form id="" name="" method="post/get" action="負責處理的服務端">--輸入系統時,必須有

          Name :定義表單的名稱;

          Method: 定義表單結果從瀏覽器傳送到服務器的方式,默認參數為:get

          Action :用來指定表單處理程序的位置(服務器端腳本處理程序)

          Fieldset:把表單分組;

          Legend:分組名稱。

          id不可重復,name可重復,get提交有長度限制,并且編碼后的內容在地址欄可見,post提交沒有長度限制,且編碼后內容不可見。

          舉個例子

          <form action="login.asp" method="post">

          <label>用戶名: </label><input type="text" name="username" />

          <label>密碼: </label><input type="password" name="password" />

          </form>

          得到結果如圖



          本期的內容比較多,大家可以在平日里多加練習,這是大數據開發基礎的重要部分,做到能更熟練,更準確,希望大家能有所進步。


          主站蜘蛛池模板: 成人国内精品久久久久一区| 一区二区三区日本电影| 麻豆一区二区三区精品视频| 精品无人区一区二区三区| 亚洲乱色熟女一区二区三区蜜臀 | 激情内射亚洲一区二区三区| 午夜一区二区在线观看| 国精产品一区一区三区| 欧美一区内射最近更新| 亚欧色一区W666天堂| 在线观看午夜亚洲一区| 精品无码人妻一区二区三区品| 日韩av片无码一区二区不卡电影 | 成人免费观看一区二区| 天美传媒一区二区三区| 麻豆视传媒一区二区三区| 久久一区二区精品| 无码AV一区二区三区无码 | 亚洲国产日韩在线一区| 国产综合无码一区二区三区| 亚洲综合一区二区精品久久| 一本大道东京热无码一区| 制服美女视频一区| 国产成人AV区一区二区三| 无码精品一区二区三区| 中文字幕一区在线播放| 无码精品人妻一区二区三区漫画 | 国产精品资源一区二区| 一区二区三区视频观看| 精品国产一区AV天美传媒| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久一区二区三区免费播放| 国产精品无码一区二区三区毛片 | 日韩电影一区二区| 国产亚洲福利一区二区免费看| 国产午夜精品一区理论片| 日韩AV片无码一区二区不卡 | 国产激情一区二区三区小说| 国产精品亚洲一区二区三区在线| 色天使亚洲综合一区二区| 亚洲AV综合色一区二区三区 |