1.配置静态变量
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),
)
复制代码
2.url.py
urlpatterns = [
path('admin/', admin.site.urls),
path('students/', views.students),
path('add_student/', views.add_student),
path('del_student/', views.del_student),
path('edit_student/', views.edit_student),
]
复制代码
3.表结构
from django.db import models
from django.db import models
class Classes(models.Model):
"""
班级表,男
"""
title = models.CharField(max_length=32)
m = models.ManyToManyField("Teachers")
class Teachers(models.Model):
"""
老师表,女
"""
name = models.CharField (max_length=32)
class Student(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
gender = models.BooleanField()
cs = models.ForeignKey(Classes,on_delete=models.CASCADE,)
复制代码
4.views.py
from django.shortcuts import render,HttpResponse
from app01 import models
import json
# Create your views here.
def students(req):
cls_list=models.Classes.objects.all()
stu_list=models.Student.objects.all()
# models.Student.objects.create(username="峰峰",age=15,gender=True,cs_id=3)
# models.Student.objects.create(username="小明",age=19,gender=False,cs_id=2)
# models.Student.objects.create(username="蓉蓉",age=22,gender=True,cs_id=1)
return render(req,"students.html",{"stu_list":stu_list,"cls_list":cls_list})
def add_student(req):
response={"status":True,"message":None,'data':None}
try:
print(req.POST)
u = req.POST.get('username')
a = req.POST.get('age')
g = req.POST.get('gender')
c = req.POST.get('cls_id')
obj=models.Student.objects.create(
username=u,
age=a,
gender=g,
cs_id=c
)
response["data"]=obj.id
except Exception as e:
response["status"]=False
response["message"]="用户输入错误"
reuslt=json.dumps(response,ensure_ascii=False)
return HttpResponse(reuslt)
def del_student(req):
ret={'status':True}
try:
nid=req.GET.get("nid")
models.Student.objects.filter(id=nid).delete();
except Exception as e:
ret['status']=False
return HttpResponse(json.dumps(ret))
def edit_student(req):
response={'code':1000,'message':None}
try:
nid= req.POST.get('nid')
user=req.POST.get('user')
age=req.POST.get('age')
gender=req.POST.get('gender')
cls_id=req.POST.get('cls_id')
models.Student.objects.filter(id=nid).update(
username=user,
age=age,
gender=gender,
cs_id=cls_id
)
except Exception as e:
response['code']=1001
response['message']=str(e)
return HttpResponse(json.dumps(response))
复制代码
5.student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>students</title>
{# <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">#}
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
<link rel="stylesheet" href="/static/plugins/font-awesome/css/font-awesome.css">
<style>
.icon {
padding: 0 5px;
}
</style>
</head>
<body>
<div class="container">
<div style="padding: 20px 0px">
<a class="btn btn-primary" id="addBtn">添加</a>
<a class="btn btn-danger">删除</a>
</div>
<div>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>班级</th>
<th>操作</th>
</tr>
</thead>
<tbody id="tb">
{% for row in stu_list %}
<tr nid="{{ row.id }}">
<td na="nid">{{ row.id }}</td>
<td na="user">{{ row.username }}</td>
<td na="age">{{ row.age }}</td>
<td na="gender">{{ row.gender }}
{# {% if row.gender %}#}
{# 男#}
{# {% else %}#}
{# 女#}
{# {% endif %}#}
</td>
<td na="cls_id" cid="{{ row.cs_id }}">{{ row.cs.title }}</td>
<td>
<a class="glyphicon glyphicon-remove icon delrow"></a>
<a class="fa fa-pencil-square-o icon editrow"></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="myModalLabel">创建学生</h4>
</div>
<div class="modal-body">
<form id="fm" class="form-horizontal">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">姓名</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="username" placeholder="姓名">
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">年龄</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="age" placeholder="年龄">
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">性别</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="gender" value="1"> 男
</label>
<label class="radio-inline">
<input type="radio" name="gender" value="0"> 女
</label>
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">班级</label>
<div class="col-sm-10">
<select class="form-control" name="cls_id">
{% for row in cls_list %}
<option value="{{ row.id }}">{{ row.title }}</option>
{% endfor %}
</select>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<span id="errorMsg" style="color: red"></span>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="btnSave">保存</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="delModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="alert alert-danger" role="alert">
<h3>删除学生信息?</h3>
<div>...<input style="display: none;" type="text" id="delNid"/></div>
<div>
<button id="cancelConfirm" type="button" class="btn btn-default">取消</button>
<button id="delConfirm" type="button" class="btn btn-danger">确定</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="myModalLabel">编辑学生</h4>
</div>
<div class="modal-body">
<form id="fm" class="form-horizontal">
<input type="text" name="nid" style="display: none">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">姓名</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="user" placeholder="姓名">
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">年龄</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="age" placeholder="年龄">
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">性别</label>
<div class="col-sm-10">
<label class="radio-inline">
<input type="radio" name="gender" value="1"> 男
</label>
<label class="radio-inline">
<input type="radio" name="gender" value="0"> 女
</label>
</div>
</div>
<div class="form-group">
<label for="age" class="col-sm-2 control-label">班级</label>
<div class="col-sm-10">
<select class="form-control" name="cls_id">
{% for row in cls_list %}
<option value="{{ row.id }}">{{ row.title }}</option>
{% endfor %}
</select>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<span id="errorMsg" style="color: red"></span>
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="btnEditSave">保存</button>
</div>
</div>
</div>
</div>
<script src="/static/js/jquery-3.1.1.js"></script>
<script src="/static/plugins/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<script>
$(function () {
bindEvent();
bindSave();
bindDel();
bindDeldelConfirm();
bindcancelConfirm();
bindEdit();
bindEditConfirm();
});
function bindEditConfirm(){
var postData={};
$("#btnEditSave").click(function(){
$("#editModal").find('input,select').each(function () {
var v = $(this).val();
var n = $(this).attr("name");
if (n == "gender") {
if ($(this).prop("checked")) {
postData[n] = v;
}
} else {
postData[n] = v;
}
});
console.log(postData);
$.ajax({
url:'/edit_student/',
type:'POST',
data:postData,
dataType:'JSON',
success:function(arg){
if(arg.code==1000){
window.location.reload();
}else{
alert(arg.message);
}
}
})
})
}
//编辑绑定事件
function bindEdit(){
$('#tb').on('click','.editrow',function(){
$('#editModal').modal('show');
//获取当前行的数据
//将数据赋值到对应的对话框的指定位置
$(this).parent().prevAll().each(function(){
var v =$(this).text();
var n = $(this).attr('na');
if(n=='cls_id'){
var cid=$(this).attr('cid');
$('#editModal select[name="cls_id"]').val(cid);
} else if(n=='gender'){
// v=True
if(v=='True'){
$('#editModal :radio[value="1"]').prop('checked',true);
}else{
$('#editModal :radio[value="0"]').prop('checked',true);
}
} else{
$("#editModal input[name='"+n+"']").val(v);
}
})
})
}
function bindcancelConfirm(){
$('#cancelConfirm').click(function(){
$('#delModal').modal('hide');
})
}
function bindDeldelConfirm(){
$('#delConfirm').click(function(){
var rowId=$('#delNid').val();
$.ajax({
url:'/del_student/',
type:'GET',
data:{'nid':rowId},
success:function(arg){
var dict=JSON.parse(arg);
if(dict.status){
$('tr[nid="'+rowId+'"]').remove();
}
$('#delModal').modal('hide');
}
})
})
}
/*
事件委托........
*/
function bindDel(){
$('#tb').on('click','.delrow',function(){
$('#delModal').modal('show');
//获取当前行的id
var rowId=$(this).parent().parent().attr("nid");
//
$('#delNid').val(rowId);
})
}
function bindEvent() {
$('#addBtn').click(function () {
$('#addModal').modal('show');
})
}
function bindSave() {
var postData = {};
$("#btnSave").click(function () {
$("#addModal").find('input,select').each(function () {
var v = $(this).val();
var n = $(this).attr("name");
if (n == "gender") {
if ($(this).prop("checked")) {
postData[n] = v;
}
} else {
postData[n] = v;
}
});
{#console.log(postData);#}
$.ajax({
url: '/add_student/',
type: 'POST',
data: postData,
success: function (arg) {
//arg是字符串
//转为字典对象
var dict = JSON.parse(arg);
//将字典对象转为字符串
{#var str_dict=JSON.stringify(dict);#}
if (dict.status) {
/*
postData = {
username:'fengfeng',
age:18,
gender:1
cls_id:2
}
自增id
dict.data
*/
createRow(postData,dict.data);
$('#addModal').modal('hide');
{#window.location.reload();#}
} else {
$("#errorMsg").text(dict.message);
}
}
})
})
}
//通过生成的方式
function createRow(postData,nid){
var tr=document.createElement('tr');
$(tr).attr('nid',nid);
var tdid=document.createElement('td');
tdid.innerHTML=nid;
$(tr).append(tdid);
var tdUser=document.createElement('td');
tdUser.innerHTML=postData.username;
$(tr).append(tdUser);
var tdAge=document.createElement('td');
tdAge.innerHTML=postData.age;
$(tr).append(tdAge);
var tdGender=document.createElement('td');
if(postData.gender =="0"){
tdGender.innerHTML="女";
} else{
tdGender.innerHTML="男";
}
$(tr).append(tdGender);
var tdClass=document.createElement('td');
var text =$('select[name="cls_id"]').find('option[value="'+postData.cls_id+'"]').text();
tdClass.innerHTML=text;
$(tr).append(tdClass);
var tdHandle='<td>\n' +
' <a class="glyphicon glyphicon-remove icon delrow"></a>\n' +
' <a class="fa fa-pencil-square-o icon editrow"></a>\n' +
' </td>';
$(tr).append(tdHandle);
$('#tb').append(tr);
}
</script>
</body>
</html>
复制代码
注意
(1) ajax中的参数 traditional,当数据中value为数组,需要设置这个参数. 用传统的方式来序列化数据,那么就设置为true。 (2) ajax中的dataType参数可以设置为JSON.此时直接返回的数据为对象。
运行结果