亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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')

 

 

 

 

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级黑人aaaaaaa做受| 黄色精品一区二区| 中文字幕亚洲综合久久| 日韩福利伦理影院免费| 欧美专区中文字幕| 欧美性jizz18性欧美| 亚洲欧美日韩天堂| 在线观看视频亚洲| 精品久久久久久久久久久久| 日韩精品在线观看视频| 国产激情综合五月久久| 亚洲成色999久久网站| 亚洲人成伊人成综合网久久久| 在线观看国产精品日韩av| 国产乱人伦真实精品视频| 国产精品视频精品视频| 久久久影视精品| 久久99热这里只有精品国产| 中文字幕日本精品| 日韩高清av一区二区三区| 国产一区二区黑人欧美xxxx| 国产国产精品人在线视| 日韩在线视频观看正片免费网站| 91a在线视频| 最近2019中文字幕大全第二页| 精品国产老师黑色丝袜高跟鞋| 96pao国产成视频永久免费| 欧美成人中文字幕| 欧美最近摘花xxxx摘花| 在线成人免费网站| 精品色蜜蜜精品视频在线观看| 国产欧美日韩亚洲精品| 最新国产成人av网站网址麻豆| 欧美日韩福利电影| 国产精品视频一| 久久伊人91精品综合网站| 欧美精品videosex性欧美| 国产盗摄xxxx视频xxx69| 国产精品综合久久久| 亚洲色图综合网| 中文字幕成人精品久久不卡| 欧美国产日韩xxxxx| 亚洲成av人影院在线观看| 高清日韩电视剧大全免费播放在线观看| 亚洲成在人线av| 国产精品99久久久久久久久| 亚洲美女av在线| 91成人福利在线| 国产一区二区三区丝袜| 国产精品偷伦一区二区| 久久中文字幕在线| 亚洲精品一区二三区不卡| 九九九久久久久久| 亚洲国产精品福利| 亚洲成av人乱码色午夜| 亚洲视频axxx| 欧美成人精品三级在线观看| 久久久亚洲成人| 国产精品一区二区av影院萌芽| 日韩欧美中文字幕在线播放| 亚洲2020天天堂在线观看| 国产精品视频中文字幕91| 一本色道久久综合亚洲精品小说| 98精品国产自产在线观看| 欧美在线www| 亚洲伊人久久大香线蕉av| 亚洲欧美国产高清va在线播| 日韩免费在线免费观看| 精品国内自产拍在线观看| 欧美丝袜一区二区| 色偷偷88888欧美精品久久久| 亚洲第一区中文字幕| 亚洲二区在线播放视频| 国产成人一区二| 日本不卡视频在线播放| 精品国产一区二区三区四区在线观看| 亚洲第一福利网站| 久久精视频免费在线久久完整在线看| 成人综合网网址| 国产成人精品av在线| 亚洲香蕉av在线一区二区三区| 国产精品扒开腿做| 日韩精品欧美国产精品忘忧草| 777精品视频| 在线观看成人黄色| 国产精品无av码在线观看| 亚洲电影免费观看高清完整版在线观看| 亚洲人成电影在线观看天堂色| 中文字幕亚洲一区二区三区五十路| 国产一区二区精品丝袜| 97超碰蝌蚪网人人做人人爽| 中文字幕日韩专区| 在线观看视频亚洲| 欧美大片免费观看| 欧美理论电影在线播放| 奇米四色中文综合久久| 欧美激情一级精品国产| 日本精品一区二区三区在线| 91大神在线播放精品| 欧美激情免费视频| 亚洲视频在线观看视频| 日韩福利视频在线观看| 九九热99久久久国产盗摄| 91精品久久久久久| 夜夜嗨av色综合久久久综合网| 欧美激情女人20p| 久久亚洲精品网站| 亚洲第一区第二区| 国产精品一区二区三区免费视频| 日韩亚洲一区二区| 国产一区av在线| 欧美成aaa人片免费看| 亚洲国产美女精品久久久久∴| 国产亚洲在线播放| 亚洲丁香婷深爱综合| 欧美小视频在线| 2018国产精品视频| 国产精品27p| 国a精品视频大全| 日韩精品高清视频| 国产精品日韩专区| 九九久久久久久久久激情| 中文字幕一区二区精品| 日日摸夜夜添一区| 欧美成人精品三级在线观看| 亚洲国产成人av在线| 91精品在线播放| 欧美怡红院视频一区二区三区| 国产精品99久久久久久人| 亚洲欧美国产精品va在线观看| 日韩av最新在线| 国产欧美精品日韩精品| 精品少妇一区二区30p| 国产精品高清网站| 国产精品久久国产精品99gif| 午夜免费在线观看精品视频| 欧美老少做受xxxx高潮| 国产精品久久久久久久久久久久久| 日韩av综合网站| 91精品综合久久久久久五月天| 国产精品免费网站| 国产成人鲁鲁免费视频a| 欧美黑人一区二区三区| 亚洲图片在线综合| 精品五月天久久| 在线观看不卡av| 久久亚洲春色中文字幕| 欧美一级在线亚洲天堂| 日韩视频免费在线| 欧美插天视频在线播放| 日韩精品在线视频美女| 九色精品免费永久在线| 韩国视频理论视频久久| 精品久久久久久中文字幕大豆网| 亚洲美腿欧美激情另类| www国产亚洲精品久久网站| www.欧美精品一二三区| 国产精品pans私拍| 国产精品看片资源| 91精品久久久久久久久久久久久| 午夜精品www| 国产在线观看一区二区三区| 欧美在线欧美在线| 91精品久久久久久久久久入口|