免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

96django_modelform-創(chuàng)新互聯(lián)

目錄

成都創(chuàng)新互聯(lián)服務項目包括合山網站建設、合山網站制作、合山網頁制作以及合山網絡營銷策劃等。多年來,我們專注于互聯(lián)網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網行業(yè)的解決方案,合山網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到合山省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

ModelForm..1

Model field與Form field:...1

ModelForm save()方法:...4

ModelForm Meta:...5

ModelForm自定義驗證:...5

ModelForm initial and ?instance:...6

ModelForm

結合了form和model,將model的field類型映射成form的field類型,復用了model的驗證,還實現了存儲數據庫的簡單方法,寫更簡潔的代碼;

django提供一個輔助類(class Meta),使之可從Model創(chuàng)建Form;

生成的Form類中將具有和指定的模型字段對應的表單字段,順序為fields屬性中指定的順序;

Model field與Form field:

每個模型字段有一個對應的默認表單字段,如模型中的ManyToManyField對應表單中的ModelMultipleChoiceField,ForeignKey<-->ModelChoiceField;

96django_modelform

例:

mysite/books/models.py

TITLE_CHOICE = (

('MR', 'Mr.'),

('MRS', 'Mrs'),

('MS', 'Ms.'),

)

class Author(models.Model):

name = models.CharField(max_length=100)

title = models.CharField(max_length=3, choice=TITLE_CHOICE)

birth_date = models.DateField(blank=True, null=True)

def __str__(self):

return self.name

class Book(models.Model):

name = models.CharField(max_length=100)

authors = models.ManyToManyField(Author)

mysite/books/forms.py

from django import forms

from django.forms import ModelForm

from .models import Author, Book

class AuthorForm(ModelForm):

class Meta:

model = Author

fields = ['name', 'title', 'birth_date']?? #使用model的全部字段,用field = '__all__',另exclude = ('birth_date')排除的字段列表,建議顯式的設置,否則有安全問題

class BookForm(ModelForm):

class Meta:

model = Book

fields = ['name', 'authors']

# from .models import TITLE_CHOICE

# class AuthorForm(forms.Form):

#???? name = forms.CharField(max_length=100)

#???? title = forms.CharField(max_length=3, widget=forms.Select(choices=TITLE_CHOICE))

#???? birth_date = forms.DateField(required=False)

#

# class BookFrom(forms.Form):

#???? name = forms.CharField(max_length=100)

#???? authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all())

注:

模型字段blank=True,表單字段require=False;

模型字段verbose_name(首字段大寫the first character capitalized),表單字段label;

模型字段help_text,表單字段help_text;

模型字段choices,表單字段widget=forms.Select(choices=TITLE_CHOICE),choices從模型中來,選項通常會包含空選項,且默認會選擇,如果字段是必選的,它會強制用戶選擇一個選項,如果模型字段的default且有一個顯示default值,將不會包含空選項(初始值即blank=False);

ModelForm save()方法:

這個方法根據表單綁定的數據創(chuàng)建并保存數據庫對象;

save()接受關鍵字參數commit,book=save(commit=False)時:

1將返回一個還沒有保存到數據庫的對象,這種情況下,要調用模型實例的form.save(),

2在多對多關系時指定commit=False,django不會立即為多對多有關系保存表單數據(只有實例在數據庫中存在時才可保存實例的多對多關系),要手動調用save_m2m()來保存多對多的表單數據

save_m2m()僅在save(commit=False)時才用到;

>>> from publish.models import Author,Book

>>> from publish.forms import AuthorForm,BookForm

>>> form = AuthorForm({'name':'jowin','title':'MR'})

>>> form.is_valid()

True

>>> form.is_bound

True

>>> form.save()?? #author=form.save(),后續(xù)用返回的對象

<Author: jowin>

>>> form = AuthorForm({'name':'mage','title':'MR'})

>>> form.is_valid()

True

>>> form.save()?? #author=form.save()

<Author: mage>

>>> authors = Author.objects.all()

>>> authors_id = [author.id for author in authors]

>>> form = BookForm({'name':'django book','authors':authors_id})

>>> form.is_valid()

True

>>> form.save()?? #book=form.save()

<Book: Book object>

>>> form = BookForm({'name':'py book','authors':authors_id})

>>> form.is_valid()

True

>>> form.save()

<Book: Book object>

>>> form = BookForm({'name':'js book','authors':authors_id})

>>> form

<BookForm bound=True, valid=Unknown, fields=(name;authors)>

>>> book = form.save(commit=False)

>>> book

<Book: Book object>

>>> book.name = 'react book'

>>> book.save()

>>> form.save_m2m()

>>> book.name

'react book'

ModelForm Meta:

mysite/publish/forms.py

class AuthorForm(ModelForm):

class Meta:

model = Author

fields = ['name', 'title', 'birth_date']?? #fields = '__all__';exclude = ('birth_date')

labels = {'name': 'Writer'}

widgets = {'name': Textarea(attrs={'cols': 80, 'rows': 20})}?? #forms.Textarea()

help_texts = {'name': 'Some useful help text'}

error_messages = {'name': {'max_length': "This writer's name is too long."}}

ModelForm自定義驗證:

mysite/publish/forms.py

class AuthorForm(ModelForm):

class Meta:

model = Author

fields = ['name', 'title', 'birth_date']?? #fields = '__all__';exclude = ('birth_date')

labels = {'name': 'Writer'}

widgets = {'name': Textarea(attrs={'cols': 80, 'rows': 20})}

help_texts = {'name': 'Some useful help text'}

error_messages = {'name': {'max_length': "This writer's name is too long."}}

def clean(self):

cleaned_data = super(AuthorForm, self).clean()

name = cleaned_data.get('name')

title = cleaned_data.get('title')

if len(name) < 40 and title == 'MR':

raise ValidationError('Field: {} and {} is error'.format(name, title))

def clean_name(self):?? #clean_<field-name>

name = self.cleaned_data['name']

if len(name) < 30:

raise ValidationError('length must more than 30')

return name

ModelForm initial and instance:

提供初始值;

mysite/publish/views.py?? #view中使用modelform

from django.shortcuts import render, get_object_or_404

from django.http import HttpResponse

from .forms import AuthorForm

from .models import Author

def index(request):

if request.method == 'POST':

???form = AuthorForm(request.POST)

if form.is_valid():

publish = form.save()

return HttpResponse('ok')

else:

form = AuthorForm()

return render(request, 'publish/publish.html', {'form': form})

def update(request, publish_id):

author = get_object_or_404(Author, id=publish_id)

if request.method == 'POST':

form = AuthorForm(request.POST, instance=author)?? #更新時要加instance,否則認為是新創(chuàng)建,也可form=AuthorForm(request.POST,initial={'name':'test'})

if form.is_valid():

author = form.save()

return HttpResponse('add succeed')

form = AuthorForm(instance=author)?? #initial={'name':'test'}

return render(request, 'publish/publish.html', {'form': form})

mysite/publish/models.py

from django.db import models

TITLE_CHOICE = (

('MR', 'Mr.'),

('MRS', 'Mrs'),

('MS', 'Ms.'),

)

class Author(models.Model):

name = models.CharField(max_length=100)

title = models.CharField(max_length=3, choices=TITLE_CHOICE)

birth_date = models.DateField(blank=True, null=True)

def __str__(self):

return self.name

class Book(models.Model):

name = models.CharField(max_length=100)

authors = models.ManyToManyField(Author)

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享文章:96django_modelform-創(chuàng)新互聯(lián)
文章網址:http://m.newbst.com/article30/dcspso.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站營銷用戶體驗關鍵詞優(yōu)化App設計自適應網站小程序開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網站建設