Django-Form表單(驗證、定製、錯誤信息、Select)

 
Django form 流程
一、建立類,繼承form.Form
二、頁面根據類的對象自動建立html標籤
三、提交,request.POST
      封裝到類的對象裏,obj=UserInfo(request.POST)
四、用戶輸入是否合法
    obj.is_valid()
五、所有合法,獲取所有內容
    obj.clean()
六、只有有不合法
    obj.errors
 
首先關閉跨站請求
#'django.middleware.csrf.CsrfViewMiddleware',
 
 
有錯誤會阻止提交,並提示錯誤信息
成功提交,能夠獲取到提交的值
 
 
 
 
Form定製化
定製錯誤信息
mail = forms.EmailField(error_messages={'required':u'郵箱不能爲空'})
 
定製錯誤規則
mobile = forms.CharField(validators=[mobile_validate,],
                        error_messages={'required':u'手機不能爲空'})
 
from django.shortcuts import render
from django import forms
import re
from django.core.exceptions import ValidationError
def mobile_validate(value):
    mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
    if not mobile_re.match(value):
        raise ValidationError('手機號碼格式錯誤')

class UserInfo(forms.Form):
    email = forms.EmailField(error_messages={'required':u'郵箱不能爲空'})
    host = forms.CharField(error_messages={'required':u'主機不能爲空'})
    port = forms.CharField(error_messages={'required':u'端口不能爲空'})
    mobile = forms.CharField(validators=[mobile_validate,],                     #定義錯誤規則函數
      error_messages={'required':u'手機不能爲空'},
      widget=forms.TextInput(attrs={'class':'form-control',   #定義class
      'placeholder':u'請輸入手機號'}))
        beizhu = forms.CharField(required=False,    #備註容許爲空
      widget=forms.Textarea(attrs={'class':'form-control',       #定義爲多行輸入框
      'placeholder':u'請輸入備註'}))
   user_type_choice = (
          (0,u'普通用戶'),
       (1,u'高級用戶'),
      )
   user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class':'form-control'}))

  

 
 
 
保存用戶輸入內容
obj = AccountForm.LoginForm(request.POST)
 
 
 
 
 
 
Form表單驗證以及錯誤信息
錯誤信息格式:
普通格式:
from django.shortcuts import render,HttpResponse
from web.forms import account as AccountForm

def login(request):
    obj = AccountForm.LoginForm(request.POST)
    if request.method == 'POST':
        if obj.is_valid():
            all_data = obj.clean()
        else:
            #用於Form表單提交
       error = obj.errors
            #print error['username'][0]
            #print error['password'][0]
       return render(request, 'account/login.html',{'obj':obj,'error':error})

    return render(request, 'account/login.html',{'obj':obj})

  

建立一個simple_tag,使其輸 error['username'][0]
 
 
{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/login/" method="post">
        <p>{{ obj.username }}
            {% error_msg error.username %}
        </p>
        <p>{{ obj.password }}
            {% error_msg error.password %}
        </p>
        <input type="submit" value="提交">
    </form>

  

 
 
JSON格式
def login(request):
    obj = AccountForm.LoginForm(request.POST)
    if request.method == 'POST':
        if obj.is_valid():
            all_data = obj.clean()
        else:
            #用於Ajax
error = obj.errors.as_json()
            #print error
return HttpResponse(error)
        return render(request, 'account/login.html',{'obj':obj,'error':error})
    return render(request, 'account/login.html',{'obj':obj})
<body>
    <form action="/login/" method="post">
        <p>{{ obj.username }}
            {% error_msg error.username %}
        </p>
        <p>{{ obj.password }}
            {% error_msg error.password %}
        </p>
        <input type="submit" value="Ajax提交" onclick="SubmitAjax()">
    </form>

    <script src="{{ STATIC_URL }}js/jquery-2.1.4.min.js"></script>
    <script>
function SubmitAjax(){
            $.ajax({
                url:'/login/',
type:'POST',
data:{'username':'','password':''},
success:function(arg){
                    console.log(arg)
                }
            })
        }
    </script>
</body>

  

  

 
 
 
Form生成select標籤


靜態select
動態select

當增長數據庫數據時
不會更新,除非關閉程序,從新載入纔會更新


解決方法:利用面向對象類的靜態字段
 
from django import forms
import json

class ImportForm(forms.Form):
    #靜態select
HOST_TYPE_LIST = (
        (0,'物理機'),
(1,'虛擬機'),
)
    host_type = forms.IntegerField(
        widget=forms.Select(choices=HOST_TYPE_LIST)
    )
    hostname = forms.CharField()

    #動態select
    # admin_dic = ((1,'yangmv'),(1,"bob"),)
    # w_obj = open('db_admin','w')
    # w_obj.write(json.dumps(admin_dic))
    # w_obj.close()
f_obj = open('db_admin','r')
    data = f_obj.read()
    data_tuple = json.loads(data)
    admin = forms.IntegerField(
        widget=forms.Select(choices=data_tuple)
    )

    def __init__(self,*args,**kwargs):
        super(ImportForm,self).__init__(*args,**kwargs)
        tmp = open('db_admin')
        data = tmp.read()
        data_tuple = json.loads(data)
        self.fields['admin'].widget.choices = data_tuple

  

 
再次增長數據庫數據,直接刷新頁面便可讀取到新數據
 
優化後代碼
from django import forms
import json

class ImportForm(forms.Form):
    admin = forms.IntegerField(widget=forms.Select())
    def __init__(self,*args,**kwargs):
        super(ImportForm,self).__init__(*args,**kwargs)
        tmp = open('db_admin')
        data = tmp.read()
        data_tuple = json.loads(data)
        self.fields['admin'].widget.choices = data_tuple

  

 
 
 
 
使用models獲取select數據
(models操做,後面一偏文章會詳細介紹)
 
class Select(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=32)
<body>
    <form action="/home/">
        <p>{{ obj.admin }}</p>
    </form>
</body>
def home(request):
    obj = HomeForm.ImportForm()
    return render(request, 'home/home.html',{'obj':obj})

 

models.Select.objects.all().values_list('id','username')
 
相關文章
相關標籤/搜索