1. 程式人生 > >Django組件—forms組件

Django組件—forms組件

else 數字 ror sub app 字段 bubuko 源碼 error

forms組件:

  校驗字段功能:

  針對一個實例:註冊用戶。

  模型:models.py

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    email=models.EmailField()
    tel=models.CharField(max_length=32)

  模板:register.html

<!DOCTYPE html>
<html lang="en">
<
head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <div> <label for="user">用戶名</label> <p><input type="text" name="name" id="name"></p>
</div> <div> <label for="pwd">密碼</label> <p><input type="password" name="pwd" id="pwd"></p> </div> <div> <label for="r_pwd">確認密碼</label> <p><input type="password" name="r_pwd" id="r_pwd"
></p> </div> <div> <label for="email">郵箱</label> <p><input type="text" name="email" id="email"></p> </div> <input type="submit"> </form> </body> </html>

  視圖函數:register

# forms組件
from django.forms import widgets

wid_01=widgets.TextInput(attrs={"class":"form-control"})
wid_02=widgets.PasswordInput(attrs={"class":"form-control"})

class UserForm(forms.Form):
    name=forms.CharField(max_length=32,
                         widget=wid_01
                         )
    pwd=forms.CharField(max_length=32,widget=wid_02)
    r_pwd=forms.CharField(max_length=32,widget=wid_02)
    email=forms.EmailField(widget=wid_01)
    tel=forms.CharField(max_length=32,widget=wid_01)



def register(request):

    if request.method=="POST":
        form=UserForm(request.POST)
        if form.is_valid():
            print(form.cleaned_data)       # 所有幹凈的字段以及對應的值
        else:
            print(form.cleaned_data)       #
            print(form.errors)             # ErrorDict : {"校驗錯誤的字段":["錯誤信息",]}
            print(form.errors.get("name")) # ErrorList ["錯誤信息",]
        return HttpResponse("OK")
    form=UserForm()
    return render(request,"register.html",locals())

渲染標簽功能:

  渲染方式1:

<h3>渲染方式一</h3>
<form action="" method="post" novalidate>
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
</form>
</body>
</html>

  直接將form對象傳入,然後通過.as_p方法可以將每一個字段都以input標簽建成。

  input標簽前的名字,默認是字段名,若想顯示為中文,則需要在字段屬性中,添加lable.如:

class UserForm(forms.Form):
    name = forms.CharField(min_length=4,label="姓名")
    pwd = forms.CharField(max_length=16,label="密碼")
    age = forms.IntegerField(label="年齡")
    tel = forms.CharField(label="電話")

技術分享圖片

  渲染方式2:

<h3>渲染方式二</h3>
<form action="" method="post" novalidate>
    {% csrf_token %}
    <div>
        <label for="">用戶名</label>
        {{ form.name }}   
{#        一定要是form.字段名#}
    </div>
    <div>
        <label for="">密碼</label>
        {{ form.pwd }}
    </div>
    <div>
        <label for="">年齡</label>
        {{ form.age }}
    </div>
    <div>
        <label for="">電話</label>
        {{ form.tel }}
    </div>
    <input type="submit">
</form>

技術分享圖片

  

  渲染方式三:form表單外是加了一些bootstrap樣式

<div class="container">
    <div class="row">
        <div class="col-md-8">
            <form action="" method="post" novalidate>
                {% csrf_token %}
                {% for field in form %}
                    <div class="form-group">
                        <label for="">{{ field.label }}</label>
                        {{ field }}
                    </div>
                {% endfor %}
                <input type="submit">
            </form>
        </div>
    </div>
</div>

技術分享圖片

  顯示錯誤與重置輸入信息功能:

  視圖:

from django.shortcuts import render,HttpResponse,reverse,redirect

# Create your views here.

from app01.form import UserForm
def register(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            print("######success#######")
            print(form.cleaned_data)
            print(form.errors)
            print(type(form.errors))
            return HttpResponse("添加成功")
        else:
            print("##########failed##########")
            print(form.cleaned_data)    # 正確的情況下會顯示的字典。
            print(form.errors)   # 是一個字典。
            print(form.errors.get("name"))  # 拿到的是ul裏面包著錯誤信息
            print(form.errors.get("name")[0])  # 拿到的是錯誤信息
            return render(request,"register.html",locals())
    form = UserForm()
    return render(request,"register.html",locals())

  模板:

<div class="container">
    <div class="row">
        <div class="col-md-8 col-lg-offset-2">
            <form action="" method="post" novalidate>
                {% csrf_token %}
                {% for field in form %}
                    <div class="form-group">
                        <label for="">{{ field.label }}</label>
                        {{ field }} <span class="errors pull-left">{{ field.errors.0 }}</span>
                    </div>
                {% endfor %}
                <div class="form-group">
                    <input type="submit" class=" btn btn-success btn-sm">
                </div>
            </form>
        </div>
    </div>
</div>

局部鉤子與全局鉤子:

  模板:

from django import forms
from django.core.exceptions import ValidationError,NON_FIELD_ERRORS
from django.forms import widgets  # widgets可以設置css樣式



class UserForm(forms.Form):
    name = forms.CharField(min_length=4,label="姓名",widget=widgets.TextInput(attrs=({"class":"form-control"})))
    pwd = forms.CharField(max_length=16,label="密碼",widget=widgets.PasswordInput(attrs=({"class":"form-control"})))
    age = forms.IntegerField(label="年齡",widget=widgets.TextInput(attrs=({"class":"form-control"})))
    tel = forms.CharField(label="電話",widget=widgets.TextInput(attrs=({"class":"form-control"})))

    def clean_name(self):  # 函數名格式必須是 clean_字段名。源碼規定。
        val = self.cleaned_data.get("name")   # 從正確字典中獲取name數據。
        if not val.isdigit():       # 如果不是純數字。
            return val              # 返回源數據。
        else:
            raise ValidationError(用戶名不能是純數字)      # 否則就拋出錯誤。

    def clean_pwd(self):
        val = self.cleaned_data.get("pwd")
        if len(val)>6:
            return val
        else:
            raise ValidationError("密碼不足6位")

    def clean_age(self):
        val = self.cleaned_data.get("age")
        if int(val)>=18:
            return val
        else:
            raise ValidationError(未成年不得入內)

    def clean_tel(self):
        val = self.cleaned_data.get("tel")
        if int(val)==11:
            return val
        else:
            raise ValidationError("手機號不合法")

  視圖:

<div class="container">
    <div class="row">
        <div class="col-md-8 col-lg-offset-2">
            <form action="" method="post" novalidate>
                {% csrf_token %}
                {% for field in form %}
                    <div class="form-group">
                        <label for="">{{ field.label }}</label>
                        {{ field }} <span class="errors pull-left">{{ field.errors.0 }}</span>
                    </div>
                {% endfor %}
                <div class="form-group">
                    <input type="submit" class=" btn btn-success btn-sm">
                </div>
            </form>
        </div>
    </div>
</div>

Django組件—forms組件