注意: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 onclick="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>
知识回顾。