django - (五) Form
1. 如果自己写一个Form
-
html
<form action="/crm/cust_search/" method="get"> <input type="text" name="cust_id"> <input type="submit" value="Search"> </form>
-
urls
url(r'^cust_list/$',cust_list), url(r'^cust_search/$',cust_search),
-
models
def cust_list(request): return render(request,'cust_list.html') def cust_search(request): if "cust_id" in request.GET: message="You search for :%r" % request.GET['cust_id'] else: message="You submitted an empty form" return HttpResponse(message)
2. 使用Django-From提交表单
-
新建文件(student_sys/student/forms.py)
from django import forms from .models import Student class StudentForm(forms.Form): name = forms.CharField(label='姓名',max_length=128) sex = forms.ChoiceField(label='性别',choices=Student.SEX_ITEMS) profession = forms.CharField(label='职业',max_length=128) email = forms.EmailField(label='邮箱',max_length=128) qq = forms.CharField(label='QQ',max_length=128) phone = forms.CharField(label='手机',max_length=128)
-
html
<form action="/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"/> </form>
这里as_table可以自动将Form中的所有元素放到页面前台上
-
views
from django.shortcuts import render from django.http import HttpResponseRedirect from django.urls import reverse # Create your views here. from .forms import StudentForm from .models import Student def index(request): # 获取student内存的所有对象 students = Student.objects.all() if request.method=='POST': form = StudentForm(request.POST) if form.is_valid(): cleaned_data = form.cleaned_data student = Student() student.name = cleaned_data['name'] student.sex = cleaned_data['sex'] student.email = cleaned_data['email'] student.profession = cleaned_data['profession'] student.qq = cleaned_data['qq'] student.phone = cleaned_data['phone'] student.save() return HttpResponseRedirect(reverse('index')) else: form = StudentForm() context = { 'students':students, 'form':form, } # 使用render渲染index.html return render(request,'student/index.html',context=context)
3. 简化Django-From表单
-
新建文件(student_sys/student/forms.py)
from django import forms from .models import Student class StudentForm(forms.ModelForm):#注意这里继承的类变化 class Meta: model = Student fields = ( 'name','sex','profession', 'email','qq','phone', ) ```
-
html
<form action="/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"/> </form>
-
views
from django.shortcuts import render from django.http import HttpResponseRedirect from django.urls import reverse # Create your views here. from .forms import StudentForm from .models import Student def index(request): # 获取student内存的所有对象 students = Student.objects.all() if request.method=='POST': form = StudentForm(request.POST) if form.is_valid(): #!!!这里可以删除字段一一对应的关系配置 student.save() return HttpResponseRedirect(reverse('index')) else: form = StudentForm() context = { 'students':students, 'form':form, } # 使用render渲染index.html return render(request,'student/index.html',context=context) ```
4. 添加字段的验证
- Froms修改(student_sys/student/forms.py-在3.1函数StudentForm类中新增以下内容)
def clean_qq(self): cleaned_data = self.cleaned_data['qq'] if not cleaned_data.isdigit(): raise forms.ValidationError('写数字咯!') return int(cleaned_data)
- 打开浏览器,填个错误的QQ号就能看到变化
5. 自定义样式的添加
-
views
这里views 不用修改,仍然只需传入form对象即可
-
html
<style type="text/css"> ul.errorlist { margin: 0; padding: 0; } .errorlist li { background-color: red; color: white; display: block; font-size: 10px; margin: 0 0 3px; padding: 4px 5px; } </style> <form action="" method="post"> <div class="field"> {{ form.cust_id.errors }}<br> {{ form.cust_id.label }}: {{ form.cust_id }} </div> <input type="submit" value="Submit"> </form>
这里只示范了一个form元素的存放