def login(request): if request.method == 'GET': return render(request,'login.html') else: obj = LoginForm(request.POST) # is_valid """ 1. LoginForm實例化時, self.fields={ 'user': 正則表達式 'pwd': 正則表達式 } 2. 循環self.fields flag = True errors cleaned_data for k,v in self.fields.items(): # 1. user,正則表達式 input_value = request.POST.get(k) 正則表達式和input_value flag = False return flag """ if obj.is_valid(): print(obj.cleaned_data) else: print(obj.errors) return render(request,'login.html')
urls.pycss
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^ajax_login/', views.ajax_login), url(r'^test/', views.test), ]
views.pyhtml
def ajax_login(request): ret = {'status': True, 'msg': None} obj = LoginForm(request.POST) if obj.is_valid(): print(obj.cleaned_data) return HttpResponse(json.dumps(ret)) else: print(obj.errors) ret['status'] = False ret['msg'] = obj.errors return HttpResponse(json.dumps(ret))
templates.login.html前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用戶登陸</h1> <form id="f1" action="/login/" method="post"> {% csrf_token %} <p><input type="text" name="user">{{ obj.errors.user.0 }}</p> <p><input type="password" name="pwd">{{ obj.errors.pwd.0 }}</p> <p><input type="submit" value="提交"></p> <p><input type="button" value="Ajax提交" onclick="ajaxSubmit();"></p> </form> <script src="/static/jquery-3.2.1.min.js"></script> <script> function ajaxSubmit() { $('.c1').remove(); $.ajax({ url: '/ajax_login/', type: 'POST', data: $('#f1').serialize(), dataType: "JSON", success:function (arg) { console.log(arg); if (arg.status){ }else{ console.log(arg.msg); $.each(arg.msg, function (index,value) { var tag = document.createElement('span'); tag.innerText = value[0]; tag.className = 'c1'; $('#f1').find('input[name="'+index+'"]').after(tag); }) } } }) } </script> </body> </html>
class TestForm(Form): t1 = fields.CharField( required=True, max_length=8, min_length=2, error_messages={ 'required': 't1不能爲空', 'max_length': 't1太長', 'min_length': 't1過短', } ) t2 = fields.IntegerField( max_value=10, min_value=1000, error_messages={ 'min_value': '必須大於10', 'max_value': '必須小於1000', 'required': 't2不能爲空', 'invalid': 't2必須是數字' } ) t3 = fields.EmailField( error_messages={ 'required': 't3不能爲空', 'invalid': 't3必須是郵箱' } ) t4 = fields.URLField() t5 = fields.SlugField() # 字符串只能包含數字、字母、下劃線等字符 t6 = fields.GenericIPAddressField() t7 = fields.DateField() t8 = fields.DateTimeField() t9 = fields.RegexField( '139\d+', error_messages={ 'invalid': '輸入一個有效的值' } ) # 自定義正則表達式 包含:1 是否爲空 2 最長 3 最短 4 自定義規則
class TestForm(Form): t1 = fields.CharField( required=True, # 用於生成HTML標籤並保留用戶上次輸入的數據 只推薦使用widget widget=widgets.Textarea, # 自動生成HTML標籤 label='用戶名', # 前端能夠經過obj.t1.label訪問 initial='root', # 在input框中顯示默認值 help_text='請輸入用戶名...', # 提供幫助信息 label_suffix=':', # Label內容後綴 # validators=[], # 自定義正則表達式 disabled=True, # 是否可編輯 max_length=8, min_length=2, error_messages={ 'required': 't1不能爲空', 'max_length': 't1太長', 'min_length': 't1過短', } )
app01.views.pyjquery
class RegisterForm(Form): user = fields.CharField(min_length=8) email = fields.EmailField() password = fields.CharField(min_length=8, max_length=16) phone = fields.RegexField('139\d+') def register(request): if request.method == 'GET': obj = RegisterForm() return render(request, 'register.html', {'obj': obj}) else: obj = RegisterForm(request.POST) if obj.is_valid(): print(obj.cleaned_data) else: print(obj.errors) return render(request, 'register.html', {'obj': obj})
templates.register.htmlajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/register/" method="post" novalidate> {% csrf_token %} <p>{{ obj.user }}{{ obj.errors.user.0 }}</p> <p>{{ obj.email }}{{ obj.errors.email.0 }}</p> <p>{{ obj.password }}{{ obj.errors.password.0 }}</p> <p>{{ obj.phone }}{{ obj.errors.phone.0 }}</p> <input type="submit" value="提交"> </form> </body> </html>
urls.py正則表達式
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^classes/', views.classes), url(r'^add_class/', views.add_class), url(r'^edit_class/(\d+)/', views.edit_class), url(r'^students/', views.students), url(r'^add_student/', views.add_student), url(r'^edit_student/(\d+)/', views.edit_student), ]
app01.models.pydjango
from django.db import models # Create your models here. class Classes(models.Model): title = models.CharField(max_length=32) class Student(models.Model): name = models.CharField(max_length=32) email = models.CharField(max_length=32) age = models.IntegerField() cls_id = models.ForeignKey('Classes') class Teacher(models.Model): tname = models.CharField(max_length=32) c2t = models.ManyToManyField('Classes')
app01.views.pyjson
from django.shortcuts import render, redirect from app01 import models # Create your views here. from django.forms import Form, fields from django.forms import widgets class ClassForm(Form): title = fields.RegexField( '全棧\d+期', error_messages={ 'required': '不能爲空', 'invalid': '格式錯誤' } ) def classes(request): if request.method == 'GET': class_list = models.Classes.objects.all() return render(request, 'classes.html', {'class_list': class_list, }) def add_class(request): if request.method == 'GET': obj = ClassForm() return render(request, 'add_class.html', {'obj': obj}) else: obj = ClassForm(request.POST) if obj.is_valid(): models.Classes.objects.create(**obj.cleaned_data) return redirect('/classes/') else: print(obj.errors) return render(request, 'add_class.html', {'obj': obj}) def edit_class(request, nid): if request.method == 'GET': row = models.Classes.objects.filter(id=nid).first() # 下面是兩種讓頁面顯示初始值的方法 # obj = ClassForm(data={'title': row.title}) # 會對默認值進行校驗 obj = ClassForm(initial={'title': row.title}) # 不會對默認值進行校驗 return render(request, 'edit_class.html', {'nid': nid, 'obj': obj}) else: obj = ClassForm(request.POST) if obj.is_valid(): print(obj.cleaned_data) models.Classes.objects.filter(id=nid).update(**obj.cleaned_data) return redirect('/classes/') print(obj.errors) return render(request, 'edit_class.html', {'nid':nid, 'obj': obj}) class StudentForm(Form): name = fields.CharField( max_length=10, min_length=2, widget=widgets.TextInput(attrs={'class': 'form-control'}) ) email = fields.EmailField( widget=widgets.TextInput(attrs={'class': 'form-control'}), ) age = fields.IntegerField( min_value=20, max_value=30, widget=widgets.TextInput(attrs={'class': 'form-control'}) ) cls_id_id = fields.IntegerField( # widget=widgets.Select(choices=[(1,'上海'), (2,'北京')]), widget=widgets.Select( choices=models.Classes.objects.all().values_list('id', 'title'), attrs={'class': 'form-control'} ) ) def students(request): stu_list = models.Student.objects.all().values('id', 'name', 'age', 'email', 'cls_id__title') return render(request, 'students.html', {'stu_list': stu_list}) def add_student(request): if request.method == 'GET': obj = StudentForm() return render(request, 'add_student.html', {'obj': obj}) else: obj = StudentForm(request.POST) if obj.is_valid(): print(obj.cleaned_data) models.Student.objects.create(**obj.cleaned_data) return redirect('/students/') else: print(obj.errors) return render(request, 'add_student.html', {'obj': obj}) def edit_student(request, nid): if request.method == 'GET': row = models.Student.objects.filter(id=nid).values().first() obj = StudentForm(row) return render(request, 'edit_student.html', {'nid': nid, 'obj': obj}) else: obj = StudentForm(request.POST) if obj.is_valid(): models.Student.objects.filter(id=nid).update(**obj.cleaned_data) return redirect('/students/') else: print(obj.errors) return render(request, 'edit_student.html', {'nid': nid, 'obj': obj})
templates.classes.htmlbootstrap
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>班級列表</h1> <div> <a href="/add_class/">添加</a> </div> <ul> {% for row in class_list %} <li>{{ row.id }} {{ row.title }} <a href="/edit_class/{{ row.id }}/">編輯</a></li> {% endfor %} </ul> </body> </html>
templates.add_class.htmlapp
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>添加班級</h1> <form action="/add_class/" method="post" novalidate> {% csrf_token %} <p>{{ obj.title }}{{ obj.errors.title.0 }}</p> <input type="submit" value="提交"> </form> </body> </html>
templates.edit_class.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>編輯班級</h1> <form action="/edit_class/{{ nid }}/" method="post"> {% csrf_token %} <p>{{ obj.title }}{{ obj.errors.title.0 }}</p> <input type="submit" value="提交"> </form> </body> </html>
templates.students.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>學生列表</h1> <a href="/add_student/">添加</a> <ul> {% for stu in stu_list %} <li>{{ stu.id }}-{{ stu.name }}-{{ stu.age }}-{{ stu.email }}-{{ stu.cls_id__title }} <a href="/edit_student/{{ stu.id }}/">編輯</a></li> {% endfor %} </ul> </body> </html>
templates.add_student.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>添加學生</h1> <form action="/add_student/" method="post" novalidate> {% csrf_token %} <p>{{ obj.name }}</p> <p>{{ obj.email }}</p> <p>{{ obj.age }}</p> <p>{{ obj.cls_id_id }}</p> <input type="submit" value="提交"> </form> </body> </html>
templates.edit_student.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css"></link> </head> <body> <div style="width: 500px;margin: 10px auto;"> <form class="form-horizontal" action="/edit_student/{{ nid }}/" method="post" novalidate> {% csrf_token %} <div class="form-group"> <label class="col-sm-2 control-label">姓名</label> <div class="col-sm-10"> {{ obj.name }} </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">郵箱</label> <div class="col-sm-10"> {{ obj.email }} </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">年齡</label> <div class="col-sm-10"> {{ obj.age }} </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">班級</label> <div class="col-sm-10"> {{ obj.cls_id_id }} </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-default">Submit</button> </div> </div> </form> </div> </body> </html>