1. 程式人生 > >djangoform詳解

djangoform詳解

ttr http strong isa 數據 密碼 窗口 AD include

orm表單的功能

  • 準備數據、重構數據,以便下一步提交。
  • 為數據創建HTML 表單
  • 接收並處理客戶端提交的表單和數據

普通字段詳解:

技術分享圖片 布爾值 checkbox 技術分享圖片 charFied input() 技術分享圖片 ChoiceField (select標簽) 技術分享圖片 DateField Dateinput 標簽 技術分享圖片 emailField EaillInput 技術分享圖片 FileField 技術分享圖片 ImageField 技術分享圖片 MultipleChoiceField (select標簽 multiple)

處理關系的字段:

兩個字段可用於表示模型之間的關系:ModelChoiceFieldModelMultipleChoiceField

這兩個字段都需要單個queryset參數,用於創建字段的選擇。

技術分享圖片 ModelChoiceField 技術分享圖片 ModelMultipleChoiceField

表單裏choice用的數據庫裏數據時不會實時更新。所以需要將choice放到init裏,每次使用都執行一遍:

技術分享圖片 示例

字段的核心參數:

required

  f = forms.CharField(required=False)
  默認為True。

label

技術分享圖片
>>> from django import forms
>>> class CommentForm(forms.Form):
...     name = forms.CharField(label=‘Your name‘)
...     url = forms.URLField(label=‘Your Web site‘, required=False)
...     comment = forms.CharField()
>>> f = CommentForm(auto_id=False)
>>> print(f)
<tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
<tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>
技術分享圖片

error_messages:

error_messages 參數讓你覆蓋字段引發的異常中的默認信息。傳遞的是一個字典,其鍵為你想覆蓋的錯誤信息

has_changed():方法用於決定字段的值是否從初始值發生了改變。返回TrueFalse

字段數據:

不管表單提交的是什麽數據,一旦通過調用is_valid() 成功驗證(is_valid() 返回True),驗證後的表單數據將位於form.cleaned_data 字典中。

技術分享圖片
from django.core.mail import send_mail

if form.is_valid():
    subject = form.cleaned_data[‘subject‘]
    message = form.cleaned_data[‘message‘]
    sender = form.cleaned_data[‘sender‘]
    cc_myself = form.cleaned_data[‘cc_myself‘]

    recipients = [‘[email protected]‘]
    if cc_myself:
        recipients.append(sender)

    send_mail(subject, message, sender, recipients)
    return HttpResponseRedirect(‘/thanks/‘)
技術分享圖片

重寫驗證方法:

技術分享圖片
  # 自定義方法(局部鉤子),密碼必須包含字母和數字
  def clean_password(self):
      if self.cleaned_data.get(‘password‘).isdigit() or self.cleaned_data.get(‘password‘).isalpha():
          raise ValidationError(‘密碼必須包含數字和字母‘)
      else:
          return self.cleaned_data[‘password‘]
 
  def clean_valid_code(self):  # 檢驗驗證碼正確;之前生成的驗證碼保存在了了session中
      if self.cleaned_data.get(‘valid_code‘).upper() == self.request.session.get(‘valid_code‘):
          return self.cleaned_data[‘valid_code‘]
      else:
          raise ValidationError(‘驗證碼不正確‘)
 
  # 自定義方法(全局鉤子, 檢驗兩個字段),檢驗兩次密碼一致;
  def clean(self):
      if self.cleaned_data.get(‘password‘) != self.cleaned_data.get(‘password2‘):
          raise ValidationError(‘密碼不一致‘)
      else:
          return self.cleaned_data
 
  # 註意,上面的字典取值用get, 因為假如在clean_password中判斷失敗,那麽沒有返回值,最下面的clean方法直接取值就會失敗s 
技術分享圖片

使用表單模:

  • {{ form.as_table }} 以表格的形式將它們渲染在<tr> 標簽中
  • {{ form.as_p }} 將它們渲染在<p> 標簽中
  • {{ form.as_ul }} 將它們渲染在<li> 標簽中

手工渲染字段:{{ form.name_of_field }

技術分享圖片 技術分享圖片
{{ form.non_field_errors }}
<div class="fieldWrapper">
    {{ form.subject.errors }}
    <label for="{{ form.subject.id_for_label }}">Email subject:</label>
    {{ form.subject }}
</div>
<div class="fieldWrapper">
    {{ form.message.errors }}
    <label for="{{ form.message.id_for_label }}">Your message:</label>
    {{ form.message }}
</div>
<div class="fieldWrapper">
    {{ form.sender.errors }}
    <label for="{{ form.sender.id_for_label }}">Your email address:</label>
    {{ form.sender }}
</div>
<div class="fieldWrapper">
    {{ form.cc_myself.errors }}
    <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>
    {{ form.cc_myself }}
</div>
技術分享圖片

渲染表單的錯誤信息:{{ form.name_of_field.errors }}

叠代表單的字段{{ field }} 包含所有有用的屬性

技術分享圖片
{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}
技術分享圖片

可重用的表單模板:

在表單保存到單獨的模塊,用includ標簽來重用

技術分享圖片
{% include "form_snippet.html" %}

# In form_snippet.html:
{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}
技術分享圖片

widgets窗口小部件

widgets.attr 設置標簽屬性

技術分享圖片
class CommentForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={‘class‘: ‘special‘}))
    url = forms.URLField()
    comment = forms.CharField(widget=forms.TextInput(attrs={‘size‘: ‘40‘}))


>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr>
<tr><th>Url:</th><td><input type="url" name="url"/></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr
技術分享圖片
生成form field對象,指定類型
from django.form impor widgets,fields

xxxx = fields.CharField(widget=widgets.Textarea)

djangoform詳解