python django 表单_Django ModelForm与Form
django表單系統中,所有的表單類都作為django.forms.Form的子類創建,包括ModelForm
關于django的表單系統,主要分兩種
基于django.forms.Form
基于django.forms.ModelForm
表單API
表單有兩種狀態,綁定,未綁定 Form.is_bound()
Form.is_valid()
驗證表單數據是否合法,返回True或者False
Form.errors 錯誤字典
Form.has_error(field,code=None)
Form.initial 在表單未綁定的情況下,為表單字段設置初始值,
>>> f=ContactForm(initial={'subject':'Hi there'})
1
>>>f=ContactForm(initial={'subject':'Hi there'})
Form.has_changed() 檢查表單數據是否變化
From.cleaned_data 表單通過驗證后,可以使用cleaned_data屬性來訪問‘清潔’的數據
Form.as_p() 將表單渲染成< p >標簽
From.as_ul() 將表單渲染成< ul >標簽
From.as_table() 將表單渲染成< table > 標簽
但是這些都得自己添加
;< ul >< /ul >標簽設置表單必填行與錯誤行的樣式
Form.error_css_class
Form.required_css_class
from django import forms
class ContactForm(Form):
error_css_class = 'error' #錯誤行樣式在HTML中表示class='error'
required_css_class = 'required' #必填樣式在Html中表示clss=‘required’
1
2
3
4
fromdjangoimportforms
classContactForm(Form):
error_css_class='error'#錯誤行樣式在HTML中表示class='error'
required_css_class='required'#必填樣式在Html中表示clss=‘required’
然后在css文件中定義error與required類就行了
配置表單元素的HTML id屬性,< label >標簽
Form.auto_id
>>> f = ContactForm(auto_id=False) #這樣在html中表單不包含< label >標簽
>>> f = ContactForm(auto_id=True) #在html中表單標簽將為每個表單的id
>>> f = ContactForm(auto_id='id_for_%s') #在html中表單標簽為id_for_字段id
1
2
3
>>>f=ContactForm(auto_id=False)#這樣在html中表單不包含< label >標簽
>>>f=ContactForm(auto_id=True)#在html中表單標簽將為每個表單的id
>>>f=ContactForm(auto_id='id_for_%s')#在html中表單標簽為id_for_字段id
From.prefix 可以為Django表單添加一個命名空間
>>> mother = PersonForm(prefix='mother')
>>> father = PersonForm(prefix='father')
1
2
>>>mother=PersonForm(prefix='mother')
>>>father=PersonForm(prefix='father')
Field.required 表示該字段為必填 缺省為必填項,如需要指定不為必須
>>> f=forms.CharField(required=True)
1
>>>f=forms.CharField(required=True)
Field.label 表示友好的label,表單在頁面顯示時用到它
name=from.CharField(label="Your name")
1
name=from.CharField(label="Your name")
Field.help_text 顯示字段描述文本
Field.error_message 覆蓋默認的錯誤信息
name = forms.CharField(error_messages={'required':'Please enter your name'}) #覆蓋required的默認錯誤信息
1
name=forms.CharField(error_messages={'required':'Please enter your name'})#覆蓋required的默認錯誤信息
widget
widget 負責渲染網頁上的HTML表單
設置weidget實例樣式 利用widget.attrs
class CommentForm(forms.Form):
name=forms.CharField(widget=forms.TextInput(attrs={'class':'special'}))
comment = forms.CharField(widget= forms.TextInput(attrs={'size':'40'}))
1
2
3
classCommentForm(forms.Form):
name=forms.CharField(widget=forms.TextInput(attrs={'class':'special'}))
comment=forms.CharField(widget=forms.TextInput(attrs={'size':'40'}))
自定義了name字段的輸入樣式為類 special
comment更改的大小為40
內建的weidget
TextInput
NumberInput
EmailInput
URLInput
PasswprdInput
HiddenInput
DateInput 日期
DateTimeInput 日期/時間
TimeInput 時間
Textarea
CheckboxInput
Select
NullBooleanSelect 渲染成 unknown,yes,no三個選項
SelectMultiple
RadioSelect
CheckboxSelectMultiple 復選框列表
FileInput 文件上傳
SelectDateWidget
ModelForm表單
from django.forms import ModelForm
from myapp.models import Article
class ArticleForm(ModelForm):
class Meta:
model = Article #表單對應的model
fields = ['pub_date', 'headline', 'content', 'reporter'] #表單中顯示的字段,對應models.py中對應的字段
1
2
3
4
5
6
fromdjango.formsimportModelForm
frommyapp.modelsimportArticle
classArticleForm(ModelForm):
classMeta:
model=Article#表單對應的model
fields=['pub_date','headline','content','reporter']#表單中顯示的字段,對應models.py中對應的字段
使用的時候可以如下:
>>>form = ArticleForm()
>>>article = Article.objects.get(pk=1)
>>>form = ArticleForm(instance = article) #賦值instance可以使form表單是可以接受對象的數據
1
2
3
>>>form=ArticleForm()
>>>article=Article.objects.get(pk=1)
>>>form=ArticleForm(instance=article)#賦值instance可以使form表單是可以接受對象的數據
save()方法
每一個ModelForm都有一個save()方法,這個方法可以更具綁定的form表單創建并且保存一個數據庫對象,ModelForm的子類可以接受一個model的子類作為instance的參數,如果存在那么save()方法會更新這個實例,否則會創建一個新的實例
save(commit=False)
save()方法接受一個commit的參數,其值為True或者False。默認為True。
如果你聲明 save(commit=False),那么它就會返回一個還未保存至數據庫的對象,這樣的話 你可以用這個對象添加一些額外的數據,然后在用save()保存到數據庫
def edit(request,sid):
edit_obj = get_object_or_404(PointRule,id=sid)
if request.method == 'POST':
form = PointRuleForm(request.POST.copy(),instance=edit_obj)
if form.is_valid():
point = form.save(commit=False)
point.update_user = request.user #在form.save(commit=False時,添加一些表單中未有的數據)
point.save()
return redirect('point:index')
else:
messages.error(request, u'數據驗證錯誤')
else:
form = PointRuleForm(instance=edit_obj)
return render(request,'point/edit.html',locals())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
defedit(request,sid):
edit_obj=get_object_or_404(PointRule,id=sid)
ifrequest.method=='POST':
form=PointRuleForm(request.POST.copy(),instance=edit_obj)
ifform.is_valid():
point=form.save(commit=False)
point.update_user=request.user#在form.save(commit=False時,添加一些表單中未有的數據)
point.save()
returnredirect('point:index')
else:
messages.error(request,u'數據驗證錯誤')
else:
form=PointRuleForm(instance=edit_obj)
returnrender(request,'point/edit.html',locals())
save_m2m()方法
在save(commit=False)的時候,如果你的model中含有many-to-many的數據模型,那么你將無法使用save()方法去保存數據,只能使用save_m2m()方法來保存
在為聲明ave(commit=False),則不用如此保存,用save()就好了..
Selecting the fields to use
1.選擇model中所有字段為表單中的字段
__all__
1
__all__
例子
from django.forms import ModelForm
class AuthorForm(ModelForm)
class Meta:
model = Author
fields='__all__'
1
2
3
4
5
fromdjango.formsimportModelForm
classAuthorForm(ModelForm)
classMeta:
model=Author
fields='__all__'
2.剔除指定字段的所有數據 exclude
class PartialAuhorForm(ModelForm):
class Meta:
model = Author
exclude = ['title'] #添加Author model中出了titile字段的所有字段至PartialAuhorForm表單
1
2
3
4
classPartialAuhorForm(ModelForm):
classMeta:
model=Author
exclude=['title']#添加Author model中出了titile字段的所有字段至PartialAuhorForm表單
覆蓋字段的默認值
form django.forms import ModelForm, Textarea
form myapp.models import Author
class AuthorForm(ModelForm):
class Meta:
model=Author
fields=('name','title','birth_date')
widgets={'name':Textarea(attrs={'cols':80,'rows':20})}
1
2
3
4
5
6
7
formdjango.formsimportModelForm,Textarea
formmyapp.modelsimportAuthor
classAuthorForm(ModelForm):
classMeta:
model=Author
fields=('name','title','birth_date')
widgets={'name':Textarea(attrs={'cols':80,'rows':20})}
from django.utils.translation import ugettext_lazy as _
class AuthorForm(ModelForm):
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 name is too long")} }
1
2
3
4
5
6
7
8
fromdjango.utils.translationimportugettext_lazyas_
classAuthorForm(ModelForm):
classMeta:
model=Author
fields=('name','title','birth_date')
labels={'name':_('Writer'),}
help_texts={'name':_('some useful help text.'),}
error_messages={'name':{'max_length':_("this writer name is too long")}}
文/天天稀飯(簡書作者)原文鏈接:http://www.jianshu.com/p/5664dd79c0ba
總結
以上是生活随笔為你收集整理的python django 表单_Django ModelForm与Form的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开机显示输入最佳预设值_开机黑屏,有招了
- 下一篇: java中连接mysql数据库_java