注意:1。django项目名称不能含有中文
2.多对多查询
class_all = models.Classes.objects.all().values('id', 'name', 'm', 'm__name')
print(class_all)
teacher_all = models.Teachers.objects.all().values('id', 'name', 'classes__id', 'classes__name')
print(teacher_all)
3.
models.Classes.objects.all().values('id', 'name', 'm', 'm__name')返回的是QuerySet<[(),()...]>
models.Classes.objects.all().values('id', 'name', 'm', 'm__name')返回的是QuerySet<{(),()...}>
4.RuntimeError: You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to 127.0.0.1:8000/jax_delete_student/ (note the trailing slash), or set APPEND_SLASH=False in your
Django settings.
RuntimeError:您通过POST调用这个URL,但是URL没有以斜杠结尾,而且您有append_slash集。Django不能在维护POST数据的同时重定向到斜杠URL。将表单更改为指向127.0.0.1:8000/jax_DELETE_SUMENT/(注意后面的斜杠),或在您的Django设置
解决:url:'/jax_delete_student/' 必须是‘/*/’格式
报错:
1.添加外键报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'
解决:Classes=models.ForeignKey("Classes",'on_delete=models.CASCADE,')
2.module 'django.db.models' has noattribute'Classes'
解决:from django.db import models引入错误
改为 from app01 import models
3.You called this URL via POST, but the URLdoesn't end in a slash and you have APPEND_SLASH set. Django can't redirect tothe slash URL while maintaining POST data. Change your form to point to127.0.0.1:8000/add/ (note the trailing slash), or set APPEND_SLASH=False inyour Django settings.
原因:表单action字段没有以 '/' 结尾
将action 修改为action="/a/b/"即可修复
4.CSRF verification failed. Request aborted.
修改 {% csrf_token %}一。准备
1.数据库
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
pip载入pymysql模块
__init__.py
import pymysql
pymysql.install_as_MySQLdb()
2.静态文件
创建static 文件目录
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),
)
学生管理项目代码(一对一):
models.py
from django.db import models
# Create your models here.
from django.db import models
# Create your models here.
class Classes(models.Model):
name = models.CharField(max_length=32)
m=models.ManyToManyField('Classes')
class Students(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() gender=models.BooleanField() cs=models.ForeignKey('Classes','on_delete=models.CASCADE,')class Teachers(models.Model): name = models.CharField(max_length=32)
views.py
from django.shortcuts import render,redirect
from app01 import models
# python manage.py runserver 8000
# Create your views here.
def select_all(request):
list=models.Classes.objects.all()
return render(request,'index.html',locals())
def add(request):
if request.method=='GET':
return render(request,'add.html')
elif request.method=='POST':
className=request.POST.get('className')
models.Classes.objects.create(name=className)
return redirect('/index')
def delete(request):
nid = request.GET.get('nid')
models.Classes.objects.filter(id=nid).delete()
return redirect('/index')
def update(request):
if request.method=='GET':
nid = request.GET.get('nid')
print(nid)
obj=models.Classes.objects.get(id=nid)
return render(request,'update.html',locals())
elif request.method=='POST':
className=request.POST.get('className')
nid=request.POST.get('nid')
print(nid)
print(className)
models.Classes.objects.filter(id=nid).update(name=className)
return redirect('/index')
urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.select_all),
path('add/', views.add),
path('delete/', views.delete),
path('update/', views.update),
]
add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/add/" method="post">
{% csrf_token %}
名称:<input type="text" name="className">
<input type="submit" value="提交">
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.table01{
{#border: 1px solid ;#}
}
</style>
</head>
<body>
<div>
<table class="table01" border="1" cellspacing="0">
<thead>
<tr>
<th>ID</th><th>名称</th><th>操作</th>
</tr>
</thead>
<tbody>
{% for row in list %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }} </td>
<td>
<a href="/update?nid={{ row.id }}">修改</a>
<a href="/delete?nid={{ row.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/add">新增</a>
</div>
</body>
</html>
update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/update/" method="post">
{% csrf_token %}
<input type="hidden" name="nid" value="{{ obj.id }}">
名称:<input type="text" name="className" value="{{ obj.name }}">
<input type="submit" value="提交">
</form>
</body>
</html>
学生管理项目代码(一对多):
students.py
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
def select_all(request):
list=models.Students.objects.all()
# list01 = models.Students.objects.get(id=1)
# print(list01.cs.name)
return render(request,'index.html',locals())
def add(request):
if request.method=='GET':
list=models.Classes.objects.all()
return render(request,'add.html',locals())
if request.method=='POST':
n=request.POST.get('username')
a=request.POST.get('age')
g=request.POST.get('gender')
cla_id=request.POST.get('cla_id')
models.Students.objects.create(name=n,age=a,gender=g,cs_id=cla_id)
return redirect('/index')
def delete(request):
id=request.GET.get('nid')
models.Students.objects.get(id=id).delete()
return redirect('/index')
def update(request):
if request.method=='GET':
id = request.GET.get('nid')
obj = models.Students.objects.get(id=id)
list = models.Classes.objects.all()
return render(request, 'update.html', locals())
if request.method=='POST':
id=request.POST.get('id')
name=request.POST.get('name')
age=request.POST.get('age')
gender=request.POST.get('gender')
cla_id=request.POST.get('cla_id')
models.Students.objects.filter(id=id).update(name=name,age=age,gender=gender,cs_id=cla_id)
return redirect('/index')
urls.py
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from app01.views import students
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', students.select_all),
path('add/', students.add),
path('delete/', students.delete),
path('update/', students.update),
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.table01{
{#border: 1px solid ;#}
}
</style>
</head>
<body>
<div>
<table class="table01" border="1" cellspacing="0">
<thead>
<tr>
<th>ID</th><th>名称</th><th>年龄</th><th>性别</th><th>班级</th><th>操作</th>
</tr>
</thead>
<tbody>
{% for row in list %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }} </td>
<td>{{ row.age }} </td>
{% if row.gender %}
<td>男 </td>
{% else %}
<td>女 </td>
{% endif %}
<td>{{ row.cs.name }} </td>
<td>
<a href="/update?nid={{ row.id }}">修改</a>
<a href="/delete?nid={{ row.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/add">新增</a>
</div>
</body>
</html>
add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/add/" method="post">
{% csrf_token %}
<p> 姓名:<input type="text" name="username"></p>
<p>年龄:<input type="text" name="age" ></p>
<p>
男:<input type="radio" name="gender" checked="checked" value='1'>
女:<input type="radio" name="gender" value='0'>
</p>
班级:
<select name="cla_id" >
{% for obj in list %}
<option value="{{ obj.id }}">{{ obj.name }}</option>
{% endfor %}
</select>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/update/" method="post">
{% csrf_token %}
<input type="hidden" name="id" value="{{ obj.id }}">
<p> 姓名:<input type="text" name="name" value="{{ obj.name }}"></p>
<p>年龄:<input type="text" name="age" value="{{ obj.age }}" ></p>
<p>
{% if obj.gender %}
男:<input type="radio" name="gender" value="1" checked="checked" >
女:<input type="radio" name="gender" value="0">
{% else %}
男:<input type="radio" name="gender" value="1" >
女:<input type="radio" name="gender" value="0" checked="checked">
{% endif %}
</p>
班级:
<select name="cla_id" >
{% for row in list %}
{% if row.id == obj.cs_id %}
<option value="{{ row.id }}" selected="selected">{{ row.name }}</option>
{% else %}
<option value="{{ row.id }}">{{ row.name }}</option>
{% endif %}
{% endfor %}
</select>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
学生管理项目代码(多对多):
teachers.py
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
def select_all_teacher(request):
teacher_list = models.Teachers.objects.all()
teacher_class_list = models.Teachers.objects.all().values('id', 'name', 'classes__id', 'classes__name')
return render(request, 'teacher.html', locals())
def update_teacher(request):
if request.method=='GET':
teacher_id=request.GET.get('nid')
cls_id_contains=models.Teachers.objects.filter(id=teacher_id).values_list('classes__id') #QuerySet<[(),()...]>
cls_id_list=list(zip(*cls_id_contains))[0] #QuerySet→元组列表→元组
cls_list=models.Classes.objects.all()
return render(request, 'update_class.html', locals())
elif request.method == 'POST':
teacher_id = request.POST.get('nid')
cls_ids=request.POST.getlist('cls')
obj=models.Teachers.objects.filter(id=teacher_id).first()
print(cls_ids)
print(type(cls_ids))
obj.classes_set.set(cls_ids)
return redirect('/teacher')
teacher.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
老师:
<div>
<table class="table01" border="1" cellspacing="0">
<thead>
<tr>
<th>ID</th><th>名称</th><th>班级</th><th>操作</th>
</tr>
</thead>
<tbody>
{% for item in teacher_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }} </td>
<td>
{% for obj in teacher_class_list %}
{% if obj.id == item.id %}
<label> {{obj.classes__name}}</label>
{% endif %}
{% endfor %}
</td>
<td>
<a href="/update_teacher?nid={{ item.id }}">修改</a>
<a href="/delete_student?nid={{ row.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/add_student">新增</a>
</body>
</html>
update_teacher.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/update_teacher/" method="post">
{% csrf_token %}
<input type="hidden" name="nid" value="{{ teacher_id }}">
{% for item in cls_list %}
{% if item.id in cls_id_list %}
{{ item.name }}: <input type="checkbox" name="cls" value="{{ item.id }}" checked="checked">
{% else %}
{{ item.name }}: <input type="checkbox" name="cls" value="{{ item.id }}">
{% endif %}
{% endfor %}
<input type="submit" value="提交"/>
</form>
</body>
</html>
Ajax.
student.py
def jax_delete_student(request):
nid = request.POST.get('nid')
msg = '成功'
try:
models.Students.objects.get(id=nid).delete()
except Exception as e:
msg = str(e)
return HttpResponse(msg)
student.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.table01{
{#border: 1px solid ;#}
}
</style>
</head>
<body>
<div>
<table class="table01" border="1" cellspacing="0">
<thead>
<tr>
<th>ID</th><th>名称</th><th>年龄</th><th>性别</th><th>班级</th><th>操作</th>
</tr>
</thead>
<tbody>
{% for row in list %}
<tr nid={{ row.id }}>
<td>{{ row.id }}</td>
<td>{{ row.name }} </td>
<td>{{ row.age }} </td>
{% if row.gender %}
<td>男 </td>
{% else %}
<td>女 </td>
{% endif %}
<td>{{ row.cs.name }} </td>
<td>
<a href="/update_student?nid={{ row.id }}">修改</a>
<a href="/delete_student?nid={{ row.id }}">删除</a>
<a οnclick="remove_student(this)" href="javascript:void()" >Ajax删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/add_student">新增</a>
</div>
</body>
<script src="/static/jquery-3.3.1.js"></script>
<script >
function remove_student(ths) {
nid=$(ths).parent().parent().attr('nid')
$.ajax(
{
url:'/jax_delete_student/',
type:'POST',
data:{'nid':nid},
success:function(arg){
if (arg=='成功'){
{#window.location.reload()#}
$(ths).parent().parent().remove()
}
else{
alert('失败')
}
}
}
)
}
</script>
</html>
知识回顾。