【python】-- Django ModelForm

Django ModelForm

Django的ModelForm的驗證方式相比較form + Model的驗證方式有下列區別:html

  • ModelForm沒有form + Model的低耦合性
  • ModelForm更適合小型項目,而form + Model則無此限制
  • 都是繼承BaseForm類,所以也能使用BaseForm中的三個內置鉤子

1、ModelForm簡單示例:

一、進行modelForm實例以前先在models中建立兩張表前端

from django.db import models
 
# Create your models here.
 
class UserType(models.Model):
    caption = models.CharField(max_length=32)
 
class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    email = models.EmailField()
    user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)

二、在form.py中建立ModelFormpython

from app01 import models
from django import forms
from django.forms import fields
 
class UserInfoModelForm(forms.ModelForm): #仍是在forms裏面,須要繼承modelform
 
    class Meta:
        model = models.UserInfo  #表示去哪個類裏面去獲取字段
        fields = '__all__' #能獲取字段,也能夠對這張表進行增刪改查,all表示展現全部列
        #fields = ['username',]  #只選擇username列,這個是UserInfo中的字段
        #exclude = ["username"] #排除username字段,展現其餘字段

三、在view.py中設置驗證函數數據庫

def index(request):
    if request.method == "GET":
        obj = UserInfoModelForm()  #驗證時,建立modelform對象
        return render(request,'index.html',{'obj':obj})
    elif request.method == "POST":
        obj = UserInfoModelForm(request.POST) #在views函數裏面作校驗
        return  render(request,'index.html',{'obj':obj})

四、templas中的HTML模板設置django

<body>
    <form>
        {{ obj.as_p }}
        <input type="submit" value="提交"/>
    </form>
</body>

 

2、ModelForm中的內置組件、數據保存、示例

一、ModelForm除modle、fields、exclude組件外,其餘組件介紹:json

ModelForm
    class Meta:
        model,                           # 對應Model的
        fields=None,                     # 字段
        exclude=None,                    # 排除字段
        labels=None,                     # 提示標籤設置
        """
        labels = {
            'username':'用戶名',
            'email':'郵箱',
        }
        """
        help_texts=None,                 # 輸入框後的幫助提示信息
        """
        help_texts = {
            'username':'....',
            'email':'xxx@126.com',
        }

        """
        widgets=None,                    # 自定義插件
        """
        from django.forms import widgets as Fwidgets  #須要導入html插件,而且須要從新命名,由於跟關鍵字重複了

        #html插件
        widgets = {
            "username":Fwidgets.Textarea(attrs={'class':'c1'})  #加上屬性
        }
        """
        error_messages=None,             # 自定義錯誤信息(總體錯誤信息from django.core.exceptions import NON_FIELD_ERRORS)
        """
        error_messages = {
                "__all__":{
                    #定義總體的錯誤信息
                },
                'email':{
                    'required':'郵箱不爲空', # 根據required是code值
                    'invalid':"郵箱格式錯誤"
                }
        }
        """
        field_classes=None               # 自定義字段類 (也能夠自定義字段)
        """
        #把標籤的格式轉換爲其餘格式,這邊須要導入fields,可是須要從新起一個別名否則會跟自身的fields衝突,就會報錯
        from django.forms import fields as Ffields #導入fields,而且取一個別名
        field_classes = {
            'email':Ffields.URLField #把email格式轉換爲url格式
        }
        """
        localized_fields=('birth_date',) # 本地化,如:根據不一樣時區顯示數據
        """
        如:
            數據庫中
                2016-12-27 04:10:57
            setting中的配置
                TIME_ZONE = 'Asia/Shanghai'
                USE_TZ = True
            則顯示:
                2016-12-27 12:10:57
        """

        # ##自定義字段
        """
        #modelform能夠自定義一些字段,好比10天免登陸,這個東西不須要提交到後臺的
        class UserInfoModelForm(forms.ModelForm):
            #自定義字段
            is_rmb = Ffields.CharField(
                widget=Fwidgets.CheckboxInput() #modelform能夠自定義一些字段,好比10天免登陸,這個東西不須要提交給後臺的
            )
         
            class Meta:
                model = models.UserInfo
         
                fields = "__all__"

        """

二、models下ForeignKey、ManyToMany的數據保存app

 1 class UserType(models.Model):
 2     caption = models.CharField(max_length=32)
 3  
 4  
 5 class UserGroup(models.Model):
 6     name = models.CharField(max_length=32)
 7  
 8 class UserInfo(models.Model):
 9     username = models.CharField(max_length=32)
10     email = models.EmailField()
11     user_type = models.ForeignKey(to="UserType",to_field='id',on_delete=models.CASCADE)
12     u2g = models.ManyToManyField(UserGroup)  #跟上面的UserGroup創建多對多關係
models
#1對1的外鍵,驗證經過後,save()一下,數據就直接能夠保存在數據庫了
def index(request):
    if request.method == "GET":
        obj = UserInfoModelForm()
        return render(request,'index.html',{'obj':obj})
    elif request.method == "POST":
        obj = UserInfoModelForm(request.POST)
        if obj.is_valid():
            obj.save() #驗證成功以後,是直接保存在數據庫中
        """
        form + model中的驗證函數
        # print(obj.is_valid())
        # print(obj.cleaned_data)
        # print(obj.errors.as_json())
        """
        return  render(request,'index.html',{'obj':obj})     
ForeignKey
 1 def index(request):
 2     if request.method == "GET":
 3         obj = UserInfoModelForm()
 4         return render(request,'index.html',{'obj':obj})
 5     elif request.method == "POST":
 6         obj = UserInfoModelForm(request.POST)
 7         if obj.is_valid():
 8             # commit爲true時將會同時保存回將UserInfo表和其多對多關係表同時進行保存,爲false時什麼都不會作,須要本身手動保存UserInfo表和其多對多關係表
 9             obj.save(commit=True)
10             
11             instance = obj.save(commit=False)   # 什麼保存操做都不回作
12             instance.save()  # 這個不等於obj.save(),它只保存當前這個表數據,不會保存其多對多關係表
13             obj.save_m2m()  # 保存其多對多關係表
14         return  render(request,'index.html',{'obj':obj})
ManyToMany

三、示例ide

 1 from app01 import models
 2 
 3 
 4 def user_list(request):
 5     li = models.UserInfo.objects.all().select_related('user_type')  #select_related 只能是外鍵,不能是多對多
 6     return render(request,'user_list.html',{'li':li})
 7 
 8 def user_edit(request,nid):
 9     if request.method == "GET":
10         user_obj = models.UserInfo.objects.filter(id=nid).first()
11         mf = UserInfoModelForm(instance=user_obj)  #把對象傳進來,在前端就能顯示默認值
12         return render(request,'user_edit.html',{'mf':mf,'nid':nid})
13     elif request.method == "POST":
14         user_obj = models.UserInfo.objects.filter(id=nid).first()
15         mf = UserInfoModelForm(request.POST,instance=user_obj)  #我把數據提交過來了,而且我拿到對哪一個對象進行更新數據
16         if mf.is_valid():
17             mf.save()
18         else:
19             print(mf.errors.as_json())
20         return render(request,'user_edit.html',{'mf':mf,'nid':nid})
view.py
<body>
    <ul>
        {% for row in li %}
            <li>{{ row.username }}-{{ row.user_type.caption }}-<a href="/edit-{{ row.id }}/">編輯</a></li>
        {% endfor %}
    </ul>
</body>
user_list.html
<body>
    <form method="post" action="/edit-{{ nid }}/">
        {{ mf.as_p }}
        <input type="submit" value="提交"/>
    </form>
</body>
user_edit.html
相關文章
相關標籤/搜索