天天看點

Django的ModelForm

基于django.forms.ModelForm:與模型類綁定的Form

先定義一個ModelForm類,繼承ModelForm類

from django.forms import ModelForm

class MyModelForm(ModelForm):
    class Meta:
        model=models.UserInfo

        fields="__all__"
                   

修改視圖函數reg

def reg(request):
        if request.method=="POST":
            model_form=MyModelForm()
    
            return render(request,"reg.html",{"model_fom":model_form})           

修改reg.html網頁

<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h4>{{ error_message }}</h4>
    <form action="/reg/" method="post">
        {% csrf_token %}
        {{ model_fom.as_p }}
        <input type="submit">
    </form>
    </body>
    </html>           

打開注冊頁面,可以看到,在定義資料庫的使用者資訊表中定義的字段資訊都顯示在注冊網頁上了。

而且這裡也支援使用萬能的句點号,以及驗證使用者輸入的資訊是否與資料庫中定義的類型符合

使用者輸入資訊,驗證通過後,就要儲存到資料庫中。

def reg(request):
    if request.method=="GET":
        model_form=MyModelForm()

        return render(request,"reg.html",{"model_form":model_form})
    else: 

        model_form=MyModelForm(request.POST) # 執行個體化MyModelForm類
        if model_form.is_valid(): # 如果使用者輸入的資訊合法

            model_form.save()       # 使用者輸入的資訊儲存到資料庫中
            return redirect("/index/")

        return render(request,"reg.html",{"model_form":model_form})           

使用ModelForm編輯使用者

編輯使用者的視圖函數如下

from django.forms import ModelForm
    
    class MyModelForm(ModelForm):
        class Meta:
            model=models.UserInfo
    
            fields="__all__"
    
    def edituser(request,uid):
        user_obj = models.UserInfo.objects.filter(id=uid).first()
    
        if not user_obj:
            return redirect("/index/")
    
        if request.method=="GET":
    
            model_form=MyModelForm(instance=user_obj)
    
        else:
            model_form=MyModelForm(request.POST,instance=user_obj)
    
            if model_form.is_valid():
                model_form.save()
                return redirect("/index/")
    
        return render(request,"edit.html",{"model_form":model_form})           

需要注意的是,

ModelForm

sava

的時候有一個

commit

的參數,

commit的值預設為True

當commit等于True的時候,ModelForm就會把資料送出到資料庫當中儲存;
當commit設定為False的時候,ModelForm并不會真正在資料庫中儲存資料.           

Django的ModelForm的其他的參數和功能

可以在class Meta中設定的功能:

model=models.Userinfo           # 顯示對應Model的字段,這裡顯示使用者資訊表

fields="__all__"                # 顯示資料表中所有的字段

fields=["username","age"]       # 顯示資料表中指定的字段

exclude=["email"]               # 不顯示資料表中某些字段

labels={
    "username":"使用者名",
    "age":"年齡",
    "email":"郵箱"
}                               # 自定義頁面的标簽

help_texts={
    "username":"請輸入正确的使用者名",
    "email":"請輸入正确的郵箱格式"
}                               # 自定義在标簽後面顯示的提示幫助資訊

error_messages={
    "username":{'required':"使用者名不能為空"}
    "email":{'invalid':"郵箱不能為空"}
}                               # 自定義錯誤資訊,使用者輸入錯誤時顯示

from django import fields as field_widget
field_classes={
    "email":field_widget.EmailField
}                               # 定義标簽的類型,在這裡把email這個輸入框的類型更改為email類型

from django.forms import widgets as formwidget
widgets={
    "username":formwidget.Textarea(atts={"class":"c1"})
}                               # 自定義插件(attrs為插件的屬性)