在以前學習forms組件中,須要驗證的項目是由咱們本身來寫的,這裏可使用ModleForm來把Modle自動轉換爲Form,這樣就不用咱們本身寫驗證關係了html
############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能夠建在兩個模型中的任意一個,自動建立第三張表 authors=models.ManyToManyField(to='Author',) #在轉換成表單後若是想要顯示中文能夠在括號內寫上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轉換爲Form前端
views.py中
addBook:添加書籍git
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:編輯書籍django
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的寫法app
def get_modelForm(self): from django.forms import ModelForm class DemoModelForm(ModelForm): class Meta: model = self.model # 對全部字段進行處理 fields = "__all__" return DemoModelForm
調用的時候:ide
def add(self, request): #ModelFormDemo等同於獲得了DemoModelForm這個類,所以下面要再加括號往裏傳數據 ModelFormDemo = self.get_modelForm() form = ModelFormDemo(request.POST)
把實例化出來的form循環看下里面是什麼post
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類下面會發現有個field,在下面打印一下 print("i.field==>", i.field) #<django.forms.models.ModelMultipleChoiceField object at 0x0000015F8956B908> print(type(i.field)) <class 'django.forms.models.ModelMultipleChoiceField'> #.field屬性咱們能夠用來判斷這個字段是否是一對多或多對多
獲取app名字和關聯表的名稱學習
related_model_name = bfield.field.queryset.model._meta.model_name related_app_lable = bfield.field.queryset.model._meta.app_label
obj = form.save() print("obj==>", obj) #obj==> Django 第二版 print("type==>", type(obj)) #type==> <class 'app01.models.Book'>
咱們能夠利用這個返回值
例如:
"pk": obj.pk,
"text": str(obj)ui
具體寫法spa
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在轉換時怎麼取option對象
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() #獲得結果「男」,或「女」
1.ModleForm方便的地方不只在於能夠自動把數據表中的字段構建爲頁面,還能夠將前端傳來的數據驗證後直接進行保存,在之前咱們是本身從request.POST中get出頁面傳來的數據,而後再create到數據表中的。
2.form.save()操做包含create和update兩種含義,其區別就在於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並無什麼區別4.能夠看出ModleForm功能很是適合構建添加和編輯頁面