基于Python Django框架 + jquery Ajax技术实现CRUD

何为Django框架,它的优势是什么?

Django 项目是一个Python定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:

  1. 用于创建模型的对象关系映射
  2. 为最终用户设计的完美管理界面
  3. 一流的 URL 设计
  4. 设计者友好的模板语言
  5. 缓存系统。

优点
            1、开源框架,有完美的文档支持
            2、解决方案众多,内部功能支持较多
            3、优雅的URL,完整的路由系统
            4、自助式的后台管理

接下来使用Django框架 + jquery Ajax技术实现CRUD。

项目架构

基于Python Django框架 + jquery Ajax技术实现CRUD_第1张图片

基于Python Django框架 + jquery Ajax技术实现CRUD_第2张图片

settings.py文件(修改配置的代码)

"""
Django settings for djangoproject project.

Generated by 'django-admin startproject' using Django 2.2.6.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '(46xri8ef295s*edox_(t=w%k$ks=wx0wmm=3@1yo!c=je81-p'

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'shopapp.apps.ShopappConfig'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'djangoproject.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'djangoproject.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_test_shop1',
        'HOST': '127.0.0.1',
        'USER': 'root',
        'PASSWORD':'root',
        'PORT': '3306',
        'OPTIONS':{'isolation_level':None}
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR,"static"),
)

# 配置输出sql语句
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

urls.py文件(用于配置路由)

"""djangoproject URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    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 shopapp.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('gologin/', goLogin),
    path('login/', login),
    path('logout/', logout),
    path('regist.do', regist),
    path('upload.do', uploadFile),
    path('goajaxjobtaskinfo/', goJobTaskInfo),
    path('ajaxjobtaskinfo/', getJobTaskInfo),
    path('ajaxjobsalary/', getJobSalary),
    path('goajaxuserinfo/', goAjaxUserInfo),
    path('ajaxuserinfo/', getUserInfo),
    path('ajaxdeptinfo/', getDeptList)
]

userdata.js(Ajax)

function getUserData(currentPage, pageSize, opr, userId) {

    var userName =  document.searchForm.userName.value
    var userSex = document.searchForm.userSex.value
    var userDeptId = 0

    if(opr == 'del'){
        if(!confirm('确定要删除吗?')){
            return false
        }
    }else if(opr == 'submitUpdate'){
        userName = document.userForm.userName.value
        userSex = document.userForm.userSex.value
        userId = document.userForm.userId.value
        userDeptId = document.userForm.userDeptId.value
        currentPage = document.userForm.currentPage.value
        pageSize = document.userForm.pageSize.value
    }

    $.ajax({
        type: 'post',                            // 传数据的方式
        url: '/ajaxuserinfo/',
        dataType: 'json',                        // xml、json、script、html
        data:JSON.stringify({
            'userName': userName,     //  $('#userName') == document.getElementById('userName')
            'userSex' : userSex,
            'userId': userId,
            'userDeptId': userDeptId,
            'pageSize': pageSize,
            'currentPage': currentPage,
            'opr': opr  // 重用一个ajax请求实现增加删除修改查询 CRUD
        }),
        error: function(xhr, err){
            alert('请求失败,请检查,' + err + '!')
        },
        success: function(data, textStatus){    // success对应的回调函数的第一个参数,是服务器返回的数据
            // data = JSON.parse(data)
            if(data.code == 1 && opr != 'update'){
                var htmlText = ""
                for(var i =0;i \n' +
                        '            ' + data.userData[i].pk + '\n' +
                        '            ' + data.userData[i].fields.user_name + '\n' +
                        '            ' + (data.userData[i].fields.user_sex == 1?'男':'女') + '\n' +
                           '         ' + data.userData[i].fields.user_deptname + '\n' +
                        '            \n' +
                        ' ' +
                        ' '+
                        '            \n' +
                        '        \n'
                }
                pageText = ''+ '当前第' + data.currentPage + '页  总共有' + data.totalPage + '页  ';
                if(data.currentPage <= 1) {
                    pageText += '首页   上一页  ';
                }else{
                     pageText += '首页   ' +
                        '上一页  ';
                }

                if(data.currentPage >= data.totalPage){
                     pageText += '下一页  尾页  ';
                }else {
                    pageText += '下一页  ' +
                    '尾页  ';
                }
                pageText +='总共有'+ data.counts + '条  '
                $('#dataBody').empty()
                $('#dataBody').append(htmlText)
                $('#dataBody').append(pageText)

                document.searchForm.currentPage.value = data.currentPage
                document.searchForm.pageSize.value=data.pageSize

                 if( opr != 'search' && data.updateResult > 0 ) {
                     alert("操作成功")
                     $('#modal-default').modal('hide')

                 }else if(opr != 'search' && data.updateResult <= 0){
                     alert("操作失败")
                 }

            }else if(data.code == 1 && opr == 'update'){
                document.userForm.userName.value = data.userData.userName
                if(data.userData.userSex == 1){
                    document.getElementById('male').checked = 'checked'
                }else if(data.userData.userSex == 2){
                    document.getElementById('female').checked = 'checked'
                }
                document.userForm.userId.value = data.userData.userId
                $('#userDept').html(data.userData.userDeptName)
                document.userForm.userDeptId.value =  data.userData.userDeptId
                document.userForm.currentPage.value = data.currentPage
                document.userForm.pageSize.value = data.pageSize
                $('#modal-default').modal()
                getDeptList(0, null, 1)
            }
        }
    });
}
function getDeptList(parentId, obj, grade){
    if(parentId == -1){
        parentId = obj.value
        document.userForm.userDeptId.value = obj.value
    }else if(parentId == -99 || grade == 4){
        return false
    }
     $.ajax({
         type: 'get',                            // 传数据的方式
         url: '/ajaxdeptinfo/',
         data:{
             'parentId': parentId,     //  $('#userName') == document.getElementById('userName')
         },
         error: function (xhr, err) {
             alert('请求失败,请检查,' + err + '!')
         },
         success: function (data, textStatus) {    // success对应的回调函数的第一个参数,是服务器返回的数据
             // data = JSON.parse(data)
            if(parentId == 0){
                 if(data.code == 1){
                     htmlText = ''
                     for(var i=0;i' + data.data[i].fields.dept_name + ''
                     }
                     $('#parentDept').html(htmlText)
                 }
            }else{
                if(data.code == 1 && grade == 2){
                     if(document.getElementById('gradeTwoDept')){
                        $('#gradeTwoDept').remove()
                     }
                     if(document.getElementById('gradeTreeDept')){
                         $('#gradeTreeDept').remove()
                     }
                     htmlText = '"
                     $('#deptContainer').append(htmlText)
                 }else if(data.code == 1 && grade == 3){
                       if(document.getElementById('gradeTreeDept')){
                         $('#gradeTreeDept').remove()
                     }
                     htmlText = '"
                     $('#deptContainer').append(htmlText)
                }
            }
         }
     })
}
$(document).ready(
    function(){
        getUserData(1, 10, 'search', 0)
    }
)

admin.py文件

from django.contrib import admin

# Register your models here.
from shopapp.models import TUser
from shopapp.models import JobDept
admin.site.register(TUser)
admin.site.register(JobDept)

apps.py文件

from django.apps import AppConfig


class ShopappConfig(AppConfig):
    name = 'shopapp'

models.py文件

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models

class JobDept(models.Model):
    dept_id = models.IntegerField(primary_key=True)
    dept_name = models.CharField(unique=True, max_length=45, blank=True, null=True)
    dept_parentid = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'job_dept'

class TUser(models.Model):
    user_id = models.AutoField(db_column='USER_ID', primary_key=True)  # Field name made lowercase.
    user_name = models.CharField(db_column='USER_NAME', unique=True, max_length=32)  # Field name made lowercase.
    user_pwd = models.CharField(db_column='USER_PWD', max_length=512)  # Field name made lowercase.
    user_age = models.IntegerField(db_column='USER_AGE', blank=True, null=True)  # Field name made lowercase.
    user_sex = models.IntegerField(db_column='USER_SEX', blank=True, null=True)  # Field name made lowercase.
    user_qq = models.IntegerField(db_column='USER_QQ', blank=True, null=True)  # Field name made lowercase.
    user_cellphone = models.CharField(db_column='USER_CELLPHONE', max_length=20, blank=True, null=True)  # Field name made lowercase.
    user_money = models.FloatField(db_column='USER_MONEY', blank=True, null=True)  # Field name made lowercase.
    user_status = models.IntegerField(db_column='USER_STATUS', blank=True, null=True)  # Field name made lowercase.
    user_pic = models.CharField(db_column='USER_PIC', max_length=128, blank=True, null=True)  # Field name made lowercase.
    user_role = models.IntegerField(db_column='USER_ROLE', blank=True, null=True)  # Field name made lowercase.

    jobDept= models.ForeignKey(JobDept, db_column='', on_delete=models.CASCADE, blank=True, null=True, to_field='dept_id')  # null=True生成left join
    user_birth = models.DateTimeField(db_column='USER_BIRTH', blank=True, null=True)  # Field name made lowercase.
    user_intro = models.TextField(db_column='USER_INTRO', blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 't_user'




views.py文件(基于ORM机制的增删改查)

from django.shortcuts import render,redirect
from django.http.response import HttpResponse
from shopapp.service.userservice import UserService
from shopapp.service.jobtaskservice import JobTaskService
from shopapp.entity.jobtask import JobTask
import json
import hashlib
from .models import TUser
from .models import JobDept
from django.core import serializers
import os
from datetime import datetime

# Create your views here.
userService = UserService()
jobTaskService = JobTaskService()

def index(request):
    return render(request, 'index.html')
    pass

def goLogin(request):
    return render(request, 'login.html')
    pass

def login(request):
    userName = request.POST.get('userName')
    userPwd = request.POST.get('userPwd')
    remeberMe = request.POST.get('rememberMe')

    result = userService.findUserByUserName(userName)
    isLogin = False
    if result and (remeberMe == None or remeberMe == 'false'):
        if result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest():
            isLogin = True
            pass
    elif result and remeberMe == 'true':
        if result[0][2] == userPwd:
            isLogin = True
            pass
        pass

    if isLogin:
        userItem = {}
        userItem['userId'] = result[0][0]
        userItem['userName'] = result[0][1]
        userItem['userPic'] = result[0][9]
        userItem['userRole'] = result[0][10]
        request.session['user'] = userItem
        response = render(request, 'main.html')
        if remeberMe == 'false':
            response.set_cookie('userName', userName)
            response.set_cookie('userPwd', result[0][2])
            response.set_cookie('rememberMe', 'true')
            pass
        elif remeberMe == None:
            response = render(request, 'main.html')
            response.delete_cookie('userName')
            response.delete_cookie('userPwd')
            response.delete_cookie('rememberMe')
            pass

        return response
    else:
        return render(request, 'login.html')
    pass

def regist(request):
    userDict = json.loads(request.body.decode('utf-8'))
    '''
    user = TUser()
    user.user_name = userDict.get('userName')  # 表单提交的数据使用request.form[]
    user.user_pwd = hashlib.md5((userDict.get('userPwd')).encode(encoding='utf-8')).hexdigest()
    user.user_pic = userDict.get('userPic')
    user.user_birth = datetime.strptime(userDict.get('userBirth'), '%Y-%m-%d')
    user.user_sex = userDict.get('userSex')
    user.user_intro = userDict.get('userIntro')
    result = user.save()
    '''
    result = TUser.objects.create(
        user_name = userDict.get('userName'),
        user_pwd=hashlib.md5((userDict.get('userPwd')).encode(encoding='utf-8')).hexdigest(),
        user_pic=userDict.get('userPic'),
        user_birth=datetime.strptime(userDict.get('userBirth'), '%Y-%m-%d'),
        user_sex=userDict.get('userSex'),
        user_intro=userDict.get('userIntro')
    )
    if result:
        result = 1
    else:
        result = 0
    return HttpResponse(json.dumps({'result': result}), content_type="application/json")
    pass

def logout(request):
    request.session.flush()
    return render(request, 'login.html')
    pass

def goJobTaskInfo(request):
    return render(request, "jobinfo/jobtaskinfo.html")
    pass

def getJobTaskInfo(request):
    jobTaskData = request.body.decode('utf-8')
    jobTaskDict = json.loads(jobTaskData)
    tData = {}

    jobTask = JobTask()
    jobTask.taskTitle = jobTaskDict.get('taskTitle')
    jobTask.taskURL = jobTaskDict.get('taskURL')

    currentPage = int(jobTaskDict.get('currentPage'))
    pageSize = int(jobTaskDict.get('pageSize'))
    opr = jobTaskDict.get('opr')
    taskId = int(jobTaskDict.get('taskId'))
    jobTask.taskId = taskId

    updateResult = 0
    if opr == 'del':
        updateResult = jobTaskService.removeJobTask(taskId)
        pass
    elif opr == 'update':
        tTask = jobTaskService.findJobTaskByJobTaskId(taskId)
        tData['taskId'] = tTask.taskId
        tData['taskTitle'] = tTask.taskTitle
        tData['taskURL'] = tTask.taskURL
        returnData = {'code': 1, 'jobTaskData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}

        return HttpResponse(json.dumps(returnData), content_type="application/json")
    elif opr == 'submitUpdate':
        updateResult = jobTaskService.updateJobTask(jobTask)
        pass

    result = jobTaskService.findPageJobTaskList(jobTask, pageSize, currentPage)
    counts = jobTaskService.countJobTasks(jobTask)
    totalPage = 0

    if(counts%pageSize == 0):
        totalPage = counts//pageSize
    else:
        totalPage = counts // pageSize + 1
        pass

    returnData = {'code':1, 'jobTaskData':result, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts}

    return HttpResponse(json.dumps(returnData), content_type="application/json")
    pass

def getJobSalary(request):
    result = jobTaskService.findJobMeanSalary()
    returnData = {'code':1, 'salary':result}
    r = json.dumps(returnData)
    return HttpResponse(json.dumps(returnData), content_type="application/json")
    pass



def goAjaxUserInfo(request):
    return render(request, "systeminfo/userinfo.html")
    pass

def getUserInfo(request):
    userData = request.body.decode('utf-8')
    userDict = json.loads(userData)
    tData = {}

    user = TUser()
    user.user_name = userDict.get('userName')
    user.user_sex = userDict.get('userSex')

    currentPage = int(userDict.get('currentPage'))
    pageSize = int(userDict.get('pageSize'))
    opr = userDict.get('opr')
    userId = int(userDict.get('userId'))
    user.user_id= userId
    user.jobDept_id = int(userDict.get('userDeptId'))

    updateResult = 0
    if opr == 'del':
        updateResult = user.delete()
        pass
    elif opr == 'update':
        tUser = TUser.objects.filter(user_id=userId).values('user_id', 'user_name', 'user_sex', 'jobDept_id', 'jobDept__dept_name')
        tData['userId'] = tUser[0].get('user_id')
        tData['userName'] = tUser[0].get('user_name')
        tData['userSex'] = tUser[0].get('user_sex')
        tData['userDeptId'] = tUser[0].get('jobDept_id')
        tData['userDeptName'] = tUser[0].get('jobDept__dept_name')
        returnData = {'code': 1, 'userData': tData, 'pageSize': pageSize, 'currentPage': currentPage, 'opr':'update'}

        return HttpResponse(json.dumps(returnData), content_type="application/json")
    elif opr == 'submitUpdate':
        currentPage = 1
        updateResult = TUser.objects.filter(user_id=userId).update(user_sex=user.user_sex, jobDept_id=user.jobDept_id)
        pass
    query = TUser.objects
    if user.user_name:
        query = query.filter(user_name__contains=user.user_name)
    if user.user_sex:
        query = query.filter(user_sex=user.user_sex)
        pass

    startRow =  (currentPage - 1)*pageSize
    endRow  = currentPage*pageSize
    result = query.values('user_id', 'user_name', 'user_sex', 'jobDept__dept_name')[startRow:endRow]  # 会生成 LIMIT 2 OFFSET 1

    counts = query.count()

    totalPage = 0
    if(counts%pageSize == 0):
        totalPage = counts//pageSize
    else:
        totalPage = counts // pageSize + 1
        pass

    # data = serializers.serialize("json", result, use_natural_foreign_keys=True)
    # data = json.loads(data)
    data = []
    for tempUser in result:
        dictItem = {'pk':tempUser.get('user_id')}
        fieldsItem ={'user_name':tempUser.get('user_name'), 'user_sex':tempUser.get('user_sex'), 'user_deptname':tempUser.get('jobDept__dept_name')}
        dictItem['fields'] = fieldsItem
        data.append(dictItem)
        pass
    '''
    for tempUser, tdata in zip(result, data):
        tdata['fields']['user_deptname'] = tempUser.jobDept.dept_name # 获取外键关联的时候,是第二次查询
        pass
    '''
    returnData = {'code':1, 'userData':data, 'pageSize':pageSize, 'currentPage':currentPage, 'totalPage':totalPage, 'updateResult':updateResult, 'opr':'search','counts':counts}

    return HttpResponse(json.dumps(returnData), content_type="application/json")
    pass

def getDeptList(request):
    parentId = int(request.GET.get('parentId'))
    if parentId ==0:
        result = JobDept.objects.filter(dept_parentid__isnull=True).all()
    else:
        result = JobDept.objects.filter(dept_parentid=parentId).all()
    data = serializers.serialize("json", result)
    data = json.loads(data)

    return HttpResponse(json.dumps({'code':1, 'data':data}), content_type="application/json")
    pass

def uploadFile(request):
    # 后缀需要检查的
    file = request.FILES.get('upload')
    if file:
        try:
            with open(os.path.dirname(__file__) + os.sep + '..' + os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.name, "wb+") as fp:
                for chunk in file.chunks():
                    fp.write(chunk)
                    pass
        except Exception as e:
            return HttpResponse(json.dumps({'uploaded': 0, 'fileName': "", 'url': ""}), content_type="application/json")
            pass
        return  HttpResponse(json.dumps({'uploaded': 1, 'fileName':file.name, 'url': os.sep + 'static' + os.sep + 'uploads'+ os.sep + file.name}), content_type="application/json")
    else:
        return  HttpResponse(json.dumps({'uploaded': 0, 'fileName': "", 'url': ""}), content_type="application/json")
    pass

userinfo.html

{% include 'top.html' %}
{% include 'left.html' %}

系统管理 用户信息管理

用户信息

{{ message }}
用户ID 用户名 用户性别 部门 操作
{% include 'footer.html' %} {% load static %}

基于Python Django框架 + jquery Ajax技术实现CRUD_第3张图片

基于Python Django框架 + jquery Ajax技术实现CRUD_第4张图片

基于Python Django框架 + jquery Ajax技术实现CRUD_第5张图片

增删改查就完成了,有的不重要的html代码没有粘贴,无伤大雅,每个人的前端页面都不一样。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(基于Python Django框架 + jquery Ajax技术实现CRUD)