s4 学员管理Form
学员管理示例(Form组件实现)
- 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'^class_list/', views.class_list),
url(r'^add_class/', views.add_class),
url(r'^edit_class/(\d+)/', views.edit_class),
url(r'^student_list/', views.student_list),
url(r'^add_student/', views.add_student),
url(r'^edit_student/(\d+)/', views.edit_student),
url(r'^teacher_list/', views.teacher_list),
url(r'^add_teacher/', views.add_teacher),
url(r'^edit_teacher/(\d+)/', views.edit_teacher),
]
- models.py
from django.db import models
class Classes(models.Model):
title = models.CharField(max_length=32)
# def __str__(self):
# return self.title
class Student(models.Model):
name =models.CharField(max_length=32)
email =models.CharField(max_length=32)
age =models.IntegerField()
cls =models.ForeignKey('Classes')
class Teacher(models.Model):
tname = models.CharField(max_length=32)
c2t =models.ManyToManyField('Classes')
- views.py
from django.shortcuts import render,redirect
from app01 import models
from django.forms import Form
from django.forms import fields
from django.forms import widgets
class ClassForm(Form):
title = fields.RegexField('全栈\d+')
def class_list(request):
cls_list = models.Classes.objects.all()
return render(request,'class_list.html',{'cls_list':cls_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('/class_list/')
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(data={'title':'xxxxxxxxxx'})
# data=默认进行校验
obj = ClassForm(initial={'title':row.title})
# initial= 默认不进行校验
return render(request,'edit_class.html',{'nid':nid,'obj':obj})
else:
obj = ClassForm(request.POST)
if obj.is_valid():
models.Classes.objects.filter(id=nid).update(**obj.cleaned_data)
return redirect('/class_list/')
return render(request,'edit_class.html',{'nid':nid,'obj':obj})
class StudentForm(Form):
name = fields.CharField(
min_length=2,
max_length=6,
widget=widgets.TextInput(attrs={'class':'form-control'})
)
email=fields.EmailField(widget=widgets.TextInput(attrs={'class':'form-control'}))
age = fields.IntegerField(min_value=18,max_value=25,widget=widgets.TextInput(attrs={'class':'form-control'}))
# 单选实现:ChoiceField Select
cls_id=fields.ChoiceField(
# widget=widgets.Select(choices=[(1,'上海'),(2,'北京')])
# widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'),attrs={'class':'form-control'})
widget=widgets.Select(attrs={'class':'form-control'})
)
def __init__(self,*args,**kwargs):
super(StudentForm,self).__init__(*args,**kwargs)
self.fields['cls_id'].choices=models.Classes.objects.values_list('id','title')
def student_list(request):
stu_list= models.Student.objects.all()
return render(request,'student_list.html',{'stu_list':stu_list})
def add_student(request):
if request.method=='GET':
obj = StudentForm(initial={'cls_id':[5,]})
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('/student_list/')
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('name','email','age','cls_id').first()
obj = StudentForm(initial=row)
return render(request,'edit_student.html',{'obj':obj,'nid':nid})
else:
obj=StudentForm(request.POST)
if obj.is_valid():
models.Student.objects.filter(id=nid).update(**obj.cleaned_data)
return redirect('/student_list/')
return render(request,'edit_student.html',{'obj':obj,'nid':nid})
def teacher_list(request):
tea_list=models.Teacher.objects.all()
return render(request,'teacher_list.html',{'tea_list':tea_list})
# from django.forms import models as form_model
class TeacherForm(Form):
tname =fields.CharField(min_length=3)
# 自带多选实现,依赖model的 __str__
# xx = form_model.ModelMultipleChoiceField(queryset=models.Classes.objects.all())
# xx = form_model.ModelChoiceField(queryset=models.Classes.objects.all())
# xx =fields.CharField(
# # request.POST.get('xx')
# # widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))
# widget=widgets.SelectMultiple(choices=models.Classes.objects.values_list('id','title'))
# # 'xx':"['1','2']" 字符串 不能满足
# )
# 多选实现:fields.MultipleChoiceField choices
c2t =fields.MultipleChoiceField(
# choices=models.Classes.objects.values_list('id','title'),
widget=widgets.SelectMultiple()
)
def __init__(self,*args,**kwargs):
super(TeacherForm,self).__init__(*args,**kwargs)
self.fields['c2t'].choices=models.Classes.objects.values_list('id','title')
def add_teacher(request):
if request.method=="GET":
obj = TeacherForm()
return render(request,'add_teacher.html',{'obj':obj})
else:
obj = TeacherForm(request.POST)
print(request.POST)
print(obj.is_valid())
if obj.is_valid():
# 多对多数据添加
print(obj.cleaned_data)
xx = obj.cleaned_data.pop('c2t') # [1,2]
# models.Teacher.objects.create(tname=obj.cleaned_data['tname'])
row = models.Teacher.objects.create(**obj.cleaned_data)
print(row)
row.c2t.add(*xx)
return redirect('/teacher_list/')
return render(request,'add_teacher.html',{'obj':obj})
def edit_teacher(request,nid):
if request.method=="GET":
row = models.Teacher.objects.filter(id=nid).first()
class_ids=row.c2t.values_list('id')
# id_list=[]
id_list = list(zip(*class_ids))[0] if list(zip(*class_ids)) else []
obj=TeacherForm(initial={'tname':row.tname,'c2t':id_list})
return render(request,'edit_teacher.html',{'obj':obj,'nid':nid}) #[1,2]
else:
obj = TeacherForm(request.POST)
print(request.POST)
print(obj.is_valid())
if obj.is_valid():
# 多对多数据添加
print(obj.cleaned_data)
xx = obj.cleaned_data.pop('c2t') # [1,2]
# models.Teacher.objects.create(tname=obj.cleaned_data['tname'])
models.Teacher.objects.filter(id=nid).update(**obj.cleaned_data)
obj = models.Teacher.objects.filter(id = nid).first()
obj.c2t.set(xx)
return redirect('/teacher_list/')
return render(request,'add_teacher.html',{'obj':obj,'nid':nid})
- class_list.html
<h1>班级列表</h1>
<div><a href="/add_class/">添加</a></div>
<ul>
{% for row in cls_list %}
<li>{{ row.title }}<a href="/edit_class/{{ row.id }}/">编辑</a></li>
{% endfor %}
</ul>
- add_class.html
<h1>添加班级</h1>
<form action="/add_class/" method="POST" novalidate>
{% csrf_token %}
{{ obj.title }}{{ obj.errors.title.0 }}
<p><input type="submit"value="提交"></p>
</form>
- edit_class.html
<h1>编辑班级</h1>
<form action="/edit_class/{{ nid }}/"method="POST">
{% csrf_token%}
<p>{{ obj.title }}{{ obj.errors.title.0 }}</p>
<input type="submit"value="提交">
</form>
- student_list.html
<h1>学生列表</h1>
<a href="/add_student/">添加</a>
<ul>
{% for row in stu_list %}
<li>{{ row.name }}-{{ row.email }}-{{ row.age }}-{{ row.cls_id }}-{{ row.cls.title }}<a href="/edit_student/{{ row.id }}/">编辑</a></li>
{% endfor %}
</ul>
- add_student.html
<h1>添加学生</h1>
<form action="/add_student/" method="POST"novalidate>
{% csrf_token %}
<p>{{ obj.name }}{{ obj.errors.name.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
<p>{{ obj.age }}{{ obj.errors.age.0 }}</p>
<p>{{ obj.cls_id }}{{ obj.errors.cls_id.0 }}</p>
<input type="submit"value="提交">
</form>
- edit_student.html
# bootstrap-3.3.7-dist
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<h1>编辑学生</h1>
<form action="/edit_student/{{ nid }}" method="POST" novalidate>
{% csrf_token %}
<p>{{ obj.name }}{{ obj.errors.name.0 }}</p>
<p>{{ obj.email }}{{ obj.errors.email.0 }}</p>
<p>{{ obj.age }}{{ obj.errors.age.0 }}</p>
<p>{{ obj.cls_id }}{{ obj.errors.cls_id.0 }}</p>
<input type="submit"value="提交">
</form>
<div style="width: 500px;margin: 0 auto">
<h1>编辑学生</h1>
<form class="form-horizontal" method="POST" action="/edit_student/{{ nid }}/" >
{% 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.age }}
</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.cls_id }}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-default"value="提交"/>
</div>
</div>
</form>
</div>
</body>
</html>
- teacher_list.html
<h1>老师列表</h1>
<div><a href="/add_teacher/">添加</a></div>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>老师姓名</th>
<th>任教班级</th>
<th>编辑</th>
</tr>
</thead>
<tbody>
{% for row in tea_list %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.tname }}</td>
<td>
{% for item in row.c2t.all %}
<span>{{ item.title }}</span>
{% endfor %}
</td>
<td>
<a href="/edit_teacher/{{ row.id }}/">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
- add_teacher.html
<h1>添加老师</h1>
<form action="/add_teacher/"method="POST">
{% csrf_token %}
<p>姓名:{{ obj.tname }}{{ obj.errors.tname.0}}</p>
<p>班级:{{ obj.c2t }}{{ obj.errors.c2t.0 }}</p></p>
<input type="submit"value="提交">
</form>
- edit_teacher.html
<h1>编辑老师</h1>
<form action="/edit_teacher/{{ nid }}/" method="POST">
{% csrf_token %}
{{ obj.tname }}
{{ obj.c2t }}
<input type="submit"value="提交">
</form>