项目——1.学员管理示例


注意: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>



知识回顾。





猜你喜欢

转载自blog.csdn.net/wudiyunxing/article/details/80349030