1. 程式人生 > >ModelForm組件和forms組件補充

ModelForm組件和forms組件補充

pos email type pub valid 名稱 擁有 del ges

forms組件補充:

forms組件的三個字段:ChoiceField, ModelChoiceField & ModelMultipleChoiceField

# forms組件:ChoiceField,ModelChoiceField,ModelMultipleChoiceField:這三個可用於渲染 <select> 標簽

gender = forms.ChoiceField(choices=((1,""),(2,"")))  # 不與數據庫打交道時用 ChoiceField; 語法:forms.ChoiceField(choices=(一個一個的元組))
            
#
和數據庫打交道: # 單選用ModelChoiceField: publish = forms.ModelChoiceField(queryset=Publish.objects.all()) # 語法:forms.ModelChoiceField(queryset=QuerySet) # 多選用ModelMultipleChoiceField: author = forms.ModelMultipleChoiceField(queryset=Author.objects.all()) # 語法:forms.ModelMultipleChoiceField(queryset=QuerySet)

ModelForms 組件:

ModelForms組件的作用:驗證字段、渲染標簽和與數據庫的交互

from django import forms
from django.forms import widgets

class BookForm(forms.ModelForm):
    class Meta:
        model = Book  # 這句代碼的含義:把Book這張model表能夠當成 form組件表去使用;同時 Book 這張model表和 BookForm 表一一對應
        fields = "__all__"   # forms 組件表所使用的字段
labels = { # 給字段添加 label "title":"書籍名稱", "price":"價格" } widgets = { # 給字段添加 widgets "title":widgets.TextInput(attrs={"class":"form-control"}), "price":widgets.TextInput(attrs={"class":"form-control"}), "date":widgets.TextInput(attrs={"class":"form-control","type":"date"}), # date類型的數據要在 .TextInput(attrs={"type":"date"}) 中 加上 attrs={"type":"date"} "publish":widgets.Select(attrs={"class":"form-control"}), # 單選框要用 Select "authors":widgets.SelectMultiple(attrs={"class":"form-control"}) # 多選框要用 SelectMultiple } error_messages = { # 為字段添加錯誤信息 "title":{"required":"不能為空"}, "price":{"required":"不能為空"}, } # 添加書籍信息 def addbook(request): if request.method == "POST": form = BookForm(request.POST) # 前端傳過來的書籍信息(在request.POST中)傳入 BookForm 進行驗證 if form.is_valid(): # ModelForm 擁有 Form組件的方法 # 驗證 form 是否合法 form.save() # form.save() 就是把該記錄保存到 Book 這張model表中; # 因為 BookForm 和 Book 是對應關系,所以 save()時能直接存到 Book 表中 return redirect("/books/") form = BookForm() # 通過 BookForm 就能把 Book 這張model表當 Form表去使用 return render(request,"addbook.html",{"form":form}) # 把 form 傳入前端,直接渲染 # 編輯書籍信息 def editbook(request,edit_book_id): edit_book_obj = Book.objects.filter(pk=edit_book_id).first() if request.method == "POST": form = BookForm(instance=edit_book_obj,request.POST) if form.is_valid: form.save() # 此時 .save()是 update 操作 """ 當 BookForm()中沒有 instance= xx 時, form.save()是 create 操作;當 BookForm()中有 instance=obj 時,此時 form.save()是update 操作,並且是將 request.POST 中的數據更新到 前面的 instance=obj 這個對象中 """ return redirect("/books/") form = BookForm(instance=edit_book_obj) # 拿 edit_book_obj 這個所要編輯的書籍對象,放入 BookForm中實例化得到 form,此時form傳入前端渲染時,能把 所要編輯的書籍信息直接顯示出來:<input>,<select>的value值、selected return render(request,"editbook.html",{"form":form}) """ model表中的 CharField,DateField,EmailField等等,只有在涉及到 ModelForm 的時候才有意義; ModelForm會讓model表按照各自的 Field類型轉化成相應的 forms 組件 """

ModelForm組件和forms組件補充