国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

DjangoForm的學習

2019-11-14 17:52:00
字體:
來源:轉載
供稿:網友

django.forms 是Django處理form的庫

     本質上可以直接通過對HttPRequest達到同樣的效果,但是django.from帶來更便捷的處理方式。功能有幾點
  1. 通過form類的定義自動生成html
  2. 自己validate提交的數據
  3. 重新呈現form表單
  4. 將form的數據轉換成python的數據類型

整體介紹

  • Form對象

               Form對象,繼承django.forms.Form類繼承form的field.以及檢驗的規則。form field有多種類型,可以通過此鏈接查看:Form fields
如果你的模型是直接和model對應。則使用 ModelForm 避免重復描述
使用Form初步舉例:
from django.shortcuts import renderfrom django.http import HttpResponseRedirect
def contact(request):
    if request.method == 'POST': # form的提交方式
        form = ContactForm(request.POST) # 構建form
        if form.is_valid(): #  通過form定義的規則檢查是否正確
            # 如果form的data進行操作
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # 空的form
 
    return render(request, 'contact.html', {
        'form': form,#渲染
    })
  • 處理form中的上傳文件

  • 處理form中的數據

如果form.is_valid()為True,我們可以通過form.cleaned_data 這個dict來獲取數據自動轉型且較為方便
  • 在template中使用form

<form action="/contact/" method="post">{%csrf_token%}{{ form.as_p }}<input type="submit" value="Submit" /></form>
如果需要使用上傳在form中加入enctype="mult
form.as_p 可以將每個form的組件輸出來html中。當然也有form.as_table和form.as_ul不過,兩邊的包裹元素要自己添加。如<table>和<ul>標簽
當然可以自定義輸出的form,這里有個例子:
<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject }}
    </div>
    <div class="fieldWrapper">
        {{ form.message.errors }}
        <label for="id_message">Your message:</label>
        {{ form.message }}
    </div>
    <div class="fieldWrapper">
        {{ form.sender.errors }}
        <label for="id_sender">Your email address:</label>
        {{ form.sender }}
    </div>
    <div class="fieldWrapper">
        {{ form.cc_myself.errors }}
        <label for="id_cc_myself">CC yourself?</label>
        {{ form.cc_myself }}
    </div>
    <p><input type="submit" value="Send message" /></p></form>
  • 使用循環輸出form

例子:
<form action="/contact/" method="post">
    {# Include the hidden fields #}
    {% for hidden in form.hidden_fields %}
    {{ hidden }}
    {% endfor %}
    {# Include the visible fields #}
    {% for field in form.visible_fields %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p></form>

Form部分Api

Form class

api類型作用備注
is_bound屬性Boolean檢查當前form是否已經綁定數據 
is_valid()方法Boolean執行校驗器,檢查form中的數據是否符合定義規則 
errors屬性dict存放錯誤信息當form綁定數據以后,調用is_valid或者errors都回導致validate的執行。而且只會執行一次。不管以后調用多少次
initial屬性給form中的字段初始化
在初始化的調用方式f = ContactForm(initial={'subject': 'Hi there!'}),當然也可以在field中指定
 forms.CharField(initial='class')。兩者的優先級是:后者生效
fields屬性獲取form的字段信息
另外擁有base_fields 這個屬性,是整個Python進程的所有form的 instance共享的,如果更改其中內容。所有同一form的instantce都會
cleaned_data屬性獲取form中的安全數據
即使form出錯。也可以獲取其中正確的內容。而且同時包括Optional的字段
as_table() default、as_ul()、as_p()方法獲取form生成的html 
required_CSS_class、error_css_class屬性設定默認的css和錯誤的csseg.
<tr class="required"><th><label for="id_subject">Subject:</label>    ...<tr class="required"><th><label for="id_message">Message:</label>    ...<tr class="required error"><th><label for="id_sender">Sender:</label>      ...<tr><th><label for="id_cc_myself">Cc myself:<label> ...
auto_id屬性設置html的生成id方式

三種值:False:不生成label標簽和input的id值

    True:生成label標簽而且直接使用field的name作為id值

    "xxx_%s":生成label標簽。而且id的前綴為xxx_ 。。

ps:如果第三不加入%s。則當成True來處理。默認的處理方式是"id_%s"

label_suffix 屬性在label的值后面出現的字符串

默認為: 自己設置—>等符號

is_multipart方法檢測這個form是否需要multipart

檢查是否添加enctype="multipart/form-data"

prefix屬性一般用于同一Form區別namespace用 

bound field class

api類型作用備注
errors屬性list獲取當前綁定字段的錯誤 
label_tag(contents=Noneattrs=Nonelabel_suffix=None)方法Str獲取當前字段的生成的label_tag 
css_classes()方法Str獲取或者設置當前字段的渲染的css參數帶值就是設置。沒就是設置
values()方法獲取當前字段的值 
id_for_label字段的id只讀當前label的id設置使用
my_field = forms.CharField(widget=forms.TextInput(attrs={'id': 'myFIELD'}))

field class

api類型作用備注
clean(value)方法執行validate,如果成功輸出clean 的Str,如果失敗拋出Error 
required屬性如果設置為True,則需要設置此值 
label屬性設置輸出的html中label標簽里面的值 
inital屬性初始化值,僅在第一次初始化的時候調用 
widget屬性可以自定義widget 
help_text屬性在渲染的時候會放在渲染字段的后面 
error_messages屬性傳入一個dict重寫錯誤的消息eg.  name = forms.CharField(error_messages={'required': 'Please enter your name'})
validators屬性設置當前字段的校驗器 
localize屬性或者本地化字段 

 

上傳文件

  1. 將form類型設置為enctype="multipart/form-data"
  2. 使用request.FILES來初始化即可   f = ContactFormWithMugshot(request.POST, request.FILES) 字段

根據model生成Form

可以通過model并指定字段直接生成form,避免重復聲明

eg.

class ArticleForm(ModelForm):...     class Meta:...         model = Article...         fields = ['pub_date', 'headline', 'content', 'reporter']
 對應表:
Model fieldForm field
AutoFieldNot represented in the form
BigIntegerFieldIntegerField with min_value set to -9223372036854775808 andmax_value set to 9223372036854775807.
BooleanFieldBooleanField
CharFieldCharField with max_length set to the model field’s max_length
CommaSeparatedIntegerFieldCharField
DateFieldDateField
DateTimeFieldDateTimeField
DecimalFieldDecimalField
EmailFieldEmailField
FileFieldFileField
FilePathFieldFilePathField
FloatFieldFloatField
ForeignKeyModelChoiceField (see below)
ImageFieldImageField
IntegerFieldIntegerField
IPAddressFieldIPAddressField
GenericIPAddressFieldGenericIPAddressField
ManyToManyFieldModelMultipleChoiceField (see below)
NullBooleanFieldCharField
PositiveIntegerFieldIntegerField
PositiveSmallIntegerFieldIntegerField
SlugFieldSlugField
SmallIntegerFieldIntegerField
TextFieldCharField with widget=forms.Textarea
TimeFieldTimeField
URLFieldURLField

 

PS:

  • If the model field has blank=True, then required is set to False on the form field. Otherwise, required=True.

使用方法:

  modelForm  save方法:可以直接保存到database如果出錯也會拋出Error ,如果save(commit=False),則只會創建對象不會提交,可以繼續修改

         modelForm,中如果要指定相應field的屬性可以通過meta指定

eg.

class Meta:        model = Author        fields = ('name', 'title', 'birth_date')        labels = {            'name': _('Writer'),        }        help_texts = {            'name': _('Some useful help text.'),        }        error_messages = {            'name': {                'max_length': _("This writer's name is too long."),            },        }
也可以通過字段設置,eg.
class ArticleForm(ModelForm):    headline = MyFormField(max_length=200, required=False,                           help_text="Use puns liberally")    class Meta:        model = Article        fields = ['headline', 'content']

modelform_factory

可以在運行時動態使用factory生成modelform 不需要事先聲明。 eg.BookForm = modelform_factory(Book, fields=("author", "title"))

Formset

可以生產同一個form的set,并獲取值 使用方式:

 

def manage_authors(request):    AuthorFormSet = modelformset_factory(Author)    if request.method == 'POST':        formset = AuthorFormSet(request.POST, request.FILES)        if formset.is_valid():            formset.save()            # do something.    else:        formset = AuthorFormSet()    return render_to_response("manage_authors.html", {        "formset": formset,    })

Form assert

可以設定form需要的資源eg.

 

class CalendarWidget(forms.TextInput):

class Media:
        css = {            'all': ('pretty.css',)        }        js = ('animations.js', 'actions.js')

 

 

 

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 成都市| 上饶县| 南通市| 娱乐| 三江| 东丰县| 班戈县| 平陆县| 确山县| 黄大仙区| 隆化县| 荣成市| 含山县| 东台市| 平泉县| 固始县| 榆树市| 七台河市| 古田县| 观塘区| 皋兰县| 枣阳市| 邢台县| 浮梁县| 正宁县| 逊克县| 会同县| 陕西省| 历史| 司法| 根河市| 榆树市| 东乌| 普兰县| 通海县| 武城县| 海原县| 鱼台县| 苍梧县| 乾安县| 巴南区|