成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Django-ModleForm-創(chuàng)新互聯(lián)

在之前學習forms組件中,需要驗證的項目是由我們自己來寫的,這里可以使用ModleForm來把Modle自動轉(zhuǎn)換為Form,這樣就不用我們自己寫驗證關系了

創(chuàng)新互聯(lián)建站專注于阿克蘇企業(yè)網(wǎng)站建設,響應式網(wǎng)站,商城網(wǎng)站定制開發(fā)。阿克蘇網(wǎng)站建設公司,為阿克蘇等地區(qū)提供建站服務。全流程按需搭建網(wǎng)站,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務

轉(zhuǎn)換關系示例

############models.py############
class Book(models.Model):    
    title = models.CharField( max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)

    # 與Publish建立一對多的關系,外鍵字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 與Author表建立多對多的關系,ManyToManyField可以建在兩個模型中的任意一個,自動創(chuàng)建第三張表
    authors=models.ManyToManyField(to='Author',)

    #在轉(zhuǎn)換成表單后如果想要顯示中文可以在括號內(nèi)寫上verbose_name="書籍名稱"
############ModleForm############
from django.forms import ModelForm

class BookModelForm(ModelForm):
    class Meta:
        model=Book
        fields="__all__"
#######這是在學習ModleForm之前自己寫的form驗證########
class BookForm(forms.Form):
    title=forms.CharField()
    price=forms.DecimalField()
    publishDate=forms.DateField()

    #state=forms.ChoiceField(choices=[(1,"已出版"),(2,"未出版")])
    #ModelChoiceField是單選
    publish=forms.ModelChoiceField(queryset=Publish.objects.all())
    #ModelMultipleChoiceField是多選
    authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())

上面的示例中,ModleForm通過中間的寫法把Modle轉(zhuǎn)換為Form

具體寫法

views.py中
addBook:添加書籍

def addbook():
 if get請求:
    #實例化一個對象
    form=BookModelForm()
    #把這個對象返回給前端頁面,通過{{form.as_p}}渲染出來
    return render(request,"addbook.html",locals()) # 標簽渲染 {{form.as_p}}

if post請求:

   form=BookModelForm(request.POST) 
   if form.is_valid():
       form.save() # create操作

editBook:編輯書籍

def editbook():
if get請求:
   editbook=Book.objects.get(pk=id)
    #實例化對象中帶有instance,此時渲染出的頁面中是帶值的,正好是編輯頁面所需的效果
    form=BookModelForm(instance=editbook)
    return render(request,"addbook.html",locals()) # 標簽渲染 {{form.as_p}}

if post請求:
   editbook=Book.objects.get(pk=id)
   form=BookModelForm(request.POST,instance=editbook) 
     #有instance,此時form.save是更新操作
   if form.is_valid():
       form.save() # update操作

上面可以改成CBV的寫法

封裝示例

def get_modelForm(self):
    from django.forms import ModelForm
    class DemoModelForm(ModelForm):
        class Meta:
            model = self.model
            # 對所有字段進行處理
            fields = "__all__"

    return DemoModelForm

調(diào)用的時候:

def add(self, request):
    #ModelFormDemo等同于得到了DemoModelForm這個類,因此下面要再加括號往里傳數(shù)據(jù)
    ModelFormDemo = self.get_modelForm()
    form = ModelFormDemo(request.POST)

實例化出來的form里面有什么

把實例化出來的form循環(huán)看下里面是什么

for i in form:
    print("i==>",i)
    #<input type="text" name="title" maxlength="32" required id="id_title" />
    print("type(i)==>",type(i))
    #<class 'django.forms.boundfield.BoundField'> 
    #在BoundField類下面會發(fā)現(xiàn)有個field,在下面打印一下
    print("i.field==>", i.field)
    #<django.forms.models.ModelMultipleChoiceField object at 0x0000015F8956B908>
    print(type(i.field))
    <class 'django.forms.models.ModelMultipleChoiceField'>
    #.field屬性我們可以用來判斷這個字段是不是一對多或多對多

獲取app名字和關聯(lián)表的名稱

related_model_name = bfield.field.queryset.model._meta.model_name
related_app_lable = bfield.field.queryset.model._meta.app_label

form.save()是有返回值的

obj = form.save()
print("obj==>", obj)
#obj==> Django 第二版
print("type==>", type(obj))
#type==> <class 'app01.models.Book'>

我們可以利用這個返回值
例如:
"pk": obj.pk,
"text": str(obj)

models中l(wèi)imit_choices_to的作用

具體寫法

teachers = models.ManyToManyField(verbose_name='任課老師', to='UserInfo',related_name="abc",limit_choices_to={"depart__in":[1002,1005]})
tutor = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',limit_choices_to={"depart":1001})

渲染字段:

teachers:  select
            option: UserInfo.objects.all()
            #加上limit_choices_to相當于做了篩選
            option: UserInfo.objects.filter(depart__in=[1002,1003])

這個功能與ModelForm配合使用,告訴ModelForm在轉(zhuǎn)換時怎么取option對象

choices

models中:

class Customer(): 
    gender_choices = ((1, '男'), (2, '女'))
    gender = models.SmallIntegerField(verbose_name='性別', choices=gender_choices)

問:如何在表中插入一條記錄?

obj=Customer.objects.create(name="alex",gender=1)

問:想要得到這個對象所對應的這條記錄性別是男還是女?

print(obj.gender) #顯然這樣是不行的,只能得到1或2

固定寫法,在字段名稱前面加get_,后面加_dispaly()

obj.get_gender_displayi() #得到結(jié)果“男”,或“女”

總結(jié)

1.ModleForm方便的地方不僅在于可以自動把數(shù)據(jù)表中的字段構(gòu)建為頁面,還可以將前端傳來的數(shù)據(jù)驗證后直接進行保存,在以前我們是自己從request.POST中get出頁面?zhèn)鱽淼臄?shù)據(jù),然后再create到數(shù)據(jù)表中的。
2.form.save()操作包含create和update兩種含義,其區(qū)別就在于ModelForm實例化的對象中有沒有instance,有就是update
3.models中的字段類型

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()

models.py中models.EmailField()這類寫法其實就是為了給ModleForm使用的,如果不使用ModleForm功能,那么寫EmailField還是CharField并沒有什么區(qū)別
4.可以看出ModleForm功能非常適合構(gòu)建添加和編輯頁面

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

網(wǎng)站題目:Django-ModleForm-創(chuàng)新互聯(lián)
標題URL:http://jinyejixie.com/article42/jiihc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站維護網(wǎng)站排名、微信公眾號、手機網(wǎng)站建設、營銷型網(wǎng)站建設

廣告

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

網(wǎng)站優(yōu)化排名
昂仁县| 三门峡市| 贡山| 荆门市| 武平县| 广灵县| 江源县| 凌源市| 舒兰市| 武定县| 桂阳县| 正定县| 屯留县| 鲁甸县| 鄂伦春自治旗| 长垣县| 阜康市| 汝南县| 通渭县| 玉山县| 长寿区| 和平区| 枞阳县| 烟台市| 荥经县| 丽江市| 肥乡县| 遂昌县| 抚顺县| 四子王旗| 雷波县| 眉山市| 即墨市| 休宁县| 兴隆县| 东光县| 定日县| 汨罗市| 冀州市| 济源市| 澜沧|