Django中的Model、Form和ModelForm


一  Model(數據庫操作)

1 數據表操作

兩種類型:

  • Code First:創建類→自動生成表
  • DB First:創建表→自動生成類  (很少用)

單表操作:

一對多:(Forienkey)

多對多:(ManytoMany)

一對一(OneToOne):

應用場景:單表特別大,字段比較多的情況,可以把單表拆成兩個,做一對一對應。

 

2 數據行操作

  • 數字
  • 字符串(帶正則的字段)
  • 時間
  • 文件

http://www.cnblogs.com/wupeiqi/articles/6216618.html

二  Form(用戶請求的驗證)

 

三  ModelForm(數據庫操作和用戶請求驗證部分功能)

1. 定義ModelForm類

from django import forms
from app01 import models

class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.User     #關聯的model類
        fields = "__all__"      #或('name','email','user_type')    #驗證哪些字段,"__all__"表示所有字段
        exclude = None          #排除的字段
        labels = None           #提示信息
        help_texts = None       #幫助提示信息
        widgets = None          #自定義插件
        error_messages = None   #自定義錯誤信息(整體錯誤信息from django.core.exceptions import NON_FIELD_ERRORS)
        field_classes = None    #自定義字段類(也闊以自定義字段)
        localized_fields = ()   #本地化,根據settings中TIME_ZONE設置的不同時區顯示時間

2. ModelForm驗證執行的過程

Form所有的鈎子ModelForm都有。

is_valid() --> self.errors --> full_clean() --> self._clean_fields() --> clean_字段名(自定義方法)
                          self._clean_form() -->  clean(self) 
                          self._post_clean() (整體錯誤)

clean_字段名(自定義方法)

可以拋出異常
    def clean_username(self):
        value = self.cleaned_data['username']
        if value == 'root':
            return value
        else:
            raise ValidationError("你不是管理員!")

3. 驗證

obj = UserModelForm()
obj.is_valid()
obj.errors.as_json()
obj.clean()
obj.cleaned_data

4. 創建

user_obj = models.User.objects.get(id=nid)
model_form_obj = UserModelForm(instance=user_obj)
model_form_obj = UserModelForm(request.POST)
model_form_obj.is_valid()
model_form_obj.save()    #默認save(commit=True),默認保存多對多,當commit=False時可以拆分保存操作
#拆分為兩步:
obj = obj.save(commit=False)
obj.save()    #保存請求表數據
model_form_obj.save_m2m()  #保存多對多數據

5.  更新和初始化

obj = model.tb.objects.get(id=1)
model_form_obj = XXOOModelForm(request.POST,instance=obj)

#初始化
model_form_obj = XXOOModelForm(initial={...})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM