Django:
-
Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
-
MVC是众所周知的模式,即:将应用程序分解成三个组成部分:model(模型),view(视图),和 controller(控制 器)。
其中:- M——管理应用程序的状态(通常存储到数据库中),并约束改变状态的行为(或者叫做“业务规则”)。
- C——接受外部用户的操作,根据操作访问模型获取数据,并调用“视图”显示这些数据。控制器是将“模型”和“视图”隔离,并成为二者之间的联系纽带。
- V——负责把数据格式化后呈现给用户。
-
Django也是一个MVC框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式:
-
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
-
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
-
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
下面我们创建一个Django程序
- 终端命令:django-admin startproject sitename (在当前目录下创建一个Django程序)
话不多说 我们先看效果:
代码结构:
主要代码代码:- djangoproject
- setting.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 = '&cfuo-#5-gvv!ur)h3&=+9eq)1#3gl80@jc^f3^lpt4pzk(^(m'
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',
},
},
# Django自带的models 为了很好的观察控制台输出SQL语句。
'loggers': {
'django.db.backends': { # 模型的日志输出
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
- urls.py(配置 url地址 和函数的绑定关系 映射关系)
"""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 *
# 类似于Falsk中的rout
# 配置 url地址 和函数的绑定关系 映射关系
urlpatterns = [
path('admin/', admin.site.urls),
path('',index),
path('gologin/',goLogin),
path('login/',login),
path('logout.do',logout),
path('regist.do',regist),
path('upload.do',uploadFile),
path('goajaxjobtaskinfo.do',goJobTaskInfo),
path('ajaxjobtaskinfo.do',getJobTaskInfo),
path('ajaxjobsalary.do',getJobSalary),
path('goajaxuserinfo.do',goAjaxUserInfo),
path('ajaxuserinfo.do',getUserInfo),
path('getdeptinfo.do',getDeptList),
]
- wsgi.py
"""
WSGI config for djangoproject project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoproject.settings')
application = get_wsgi_application()
- shopapp
- basedao.py
# 引入pymysql
import pymysql
import json
import logging
import os
class BaseDao(): # DAO: database access object
def __init__(self, configFile='pymysql.json'):
self.__connection = None
self.__cursor = None
self.__config = json.load(open(os.path.dirname(__file__) + os.sep + configFile, 'r')) # 通过json配置获得数据的连接配置信息
print(self.__config)
pass
# 获取数据库连接的方法
def getConnection(self):
# 当有连接对象时,直接返回连接对象
if self.__connection:
return self.__connection
# 否则通过建立新的连接对象
try:
self.__connection = pymysql.connect(**self.__config)
return self.__connection
except pymysql.MySQLError as e:
print("Exception:" + str(e))
pass
pass
# 用于执行sql语句的通用方法 # sql注入
def execute(self, sql, params=None):
try:
self.__cursor = self.getConnection().cursor()
# result返回sql语句影响到的条数
if params: # 带参数sql语句
result = self.__cursor.execute(sql, params)
else: # 不带参数sql语句
result = self.__cursor.execute(sql)
return result
except (pymysql.MySQLError, pymysql.DatabaseError, Exception) as e:
print("出现数据库访问异常:" + str(e))
self.rollback()
pass
finally:
pass
pass
def fetch(self):
if self.__cursor:
return self.__cursor.fetchall()
pass
def fetchOne(self):
if self.__cursor:
return self.__cursor.fetchone()
pass
def commit(self):
if self.__connection:
self.__connection.commit()
pass
def rollback(self):
if self.__connection:
self.__connection.rollback()
pass
# 返回最后的自增主键
def getLastRowId(self):
if self.__cursor:
return self.__cursor.lastrowid
pass
def close(self):
if self.__cursor:
self.__cursor.close()
if self.__connection:
self.__connection.close()
pass
pass
- pymysql.json
{"host":"127.0.0.1", "user":"root","password":"root", "database":"db_test_shop1", "port":3306, "charset":"utf8"}
- jobtaskdao
from .basedao import BaseDao
class JobTaskDao(BaseDao):
def createJobTask(self, jobTask):
try:
sql = "insert into job_collect_task (task_title, job_url) values(%s, %s)"
self.getConnection()
result = self.execute(sql, (jobTask.taskTitle, jobTask.taskURL))
self.commit() # 执行了sql语句之后要commit
return result
finally:
self.close()
pass
pass
def findJobTaskList(self, jobTask):
try:
params = []
# sql语句和params就需要是动态
sql = "select * from job_collect_task where 1=1 " # where 1=1是为了便于增加and
if jobTask.taskTitle:
sql += " and task_title like %s " # 模糊查询
params.append('%'+jobTask.taskTitle + '%')
pass
if jobTask.taskURL:
sql += " and task_url=%s"
params.append(jobTask.taskURL)
pass
self.getConnection()
self.execute(sql, params)
result = self.fetch()
finally:
self.close()
return result
pass
def removeJobTask(self, taskId):
try:
sql = "delete from job_collect_task where task_id=%s"
self.getConnection()
result = self.execute(sql, (taskId, ))
self.commit() # 执行了sql语句之后要commit
return result
finally:
self.close()
pass
pass
def findJobTaskByJobTaskId(self, taskId):
try:
sql = "select * from job_collect_task where task_id=%s"
self.getConnection()
self.execute(sql, (taskId,))
result = self.fetch()
finally:
self.close()
return result
pass
def updateJobTask(self, jobTask):
try:
sql = "update job_collect_task set task_title=%s, task_url=%s where task_id=%s"
self.getConnection()
result = self.execute(sql, (jobTask.taskTitle, jobTask.taskURL, jobTask.taskId))
self.commit() # 执行了sql语句之后要commit
return result
finally:
self.close()
pass
pass
def findPageJobTaskList(self, jobTask, pageSize, currentPage):
try:
params = []
# sql语句和params就需要是动态
sql = "select task_id, task_title, task_url from job_collect_task where 1=1 " # where 1=1是为了便于增加and
if jobTask.taskTitle:
sql += " and task_title like %s " # 模糊查询
params.append('%' + jobTask.taskTitle + '%')
pass
if jobTask.taskURL:
sql += " and task_url=%s"
params.append(jobTask.taskURL)
pass
startRow = (currentPage - 1)*pageSize
sql += "limit %s, %s"
params.append(startRow)
params.append(pageSize)
self.getConnection()
self.execute(sql, params)
result = self.fetch()
finally:
self.close()
return result
pass
def countJobTasks(self, jobTask):
params = []
# sql语句和params就需要是动态
sql = "select count(*) from job_collect_task where 1=1 " # where 1=1是为了便于增加and
if jobTask.taskTitle:
sql += " and task_title like %s " # 模糊查询
params.append('%' + jobTask.taskTitle + '%')
pass
if jobTask.taskURL:
sql += " and task_url=%s"
params.append(jobTask.taskURL)
pass
self.getConnection()
self.execute(sql, params)
result = self.fetchOne()
return result
pass
pass
- userdao
from .basedao import BaseDao
class UserDao(BaseDao):
def findUserByUserName(self, userName):
try:
sql = "select * from t_user where user_name=%s"
self.getConnection()
self.execute(sql, (userName,))
result = self.fetch()
finally:
self.close()
return result
pass
def createUser(self, user):
try:
params = [user.userName, user.userPwd]
sql = "insert into t_user (user_name, user_pwd"
values = " values (%s, %s"
if user.userSex:
sql += ",user_sex"
values += ",%s"
params.append(user.userSex)
pass
if user.userPic:
sql += ",user_pic"
values += ",%s"
params.append(user.userPic)
pass
if user.userIntro:
sql += ",user_intro"
values += ",%s"
params.append(user.userIntro)
pass
if user.userBirth:
sql += ",user_birth"
values += ",DATE_FORMAT(%s,'%%Y-%%m-%%d')"
params.append(user.userBirth)
pass
sql +=")" + values + ")"
self.getConnection()
result = self.execute(sql, params)
self.commit() # 执行了sql语句之后要commit
return result
except Exception as e:
print(e)
self.rollback()
finally:
self.close()
pass
pass
def findUserList(self, user):
try:
params = []
# sql语句和params就需要是动态
sql = "select * from t_user where 1=1 " # where 1=1是为了便于增加and
if user.userName:
sql += " and user_name like %s " # 模糊查询
params.append('%'+user.userName + '%')
pass
if user.userSex:
sql += " and user_sex=%s"
params.append(user.userSex)
pass
self.getConnection()
self.execute(sql, params)
result = self.fetch()
finally:
self.close()
return result
pass
def removeUser(self, userId):
try:
sql = "delete from t_user where user_id=%s"
self.getConnection()
result = self.execute(sql, (userId, ))
self.commit() # 执行了sql语句之后要commit
return result
finally:
self.close()
pass
pass
def findUserByUserId(self, userId):
try:
sql = "select USER_ID,USER_NAME,USER_PWD,USER_AGE,USER_SEX,USER_QQ,USER_CELLPHONE," \
"USER_MONEY,USER_STATUS,USER_PIC,USER_INTRO,date_format(USER_BIRTH, '%%Y-%%m-%%d'),USER_DEPTID , dept_id, dept_name , user_role " \
"from t_user left join job_dept on t_user.user_deptid=job_dept.dept_id where user_id=%s " # where 1=1是为了便于增
self.getConnection()
self.execute(sql, (userId,))
result = self.fetch()
finally:
self.close()
return result
pass
def updateUser(self, user):
try:
params = [user.userSex]
sql = "update t_user set user_sex=%s "
if user.userDeptId > 0:
sql += ", user_deptid=%s"
params.append(user.userDeptId)
sql += ' where user_id=%s'
params.append(user.userId)
self.getConnection()
result = self.execute(sql, params)
self.commit() # 执行了sql语句之后要commit
return result
except Exception as e:
print(e)
finally:
self.close()
pass
pass
def findPageUserList(self, user, pageSize, currentPage):
try:
params = []
# sql语句和params就需要是动态
sql = "select USER_ID,USER_NAME,USER_PWD,USER_AGE,USER_SEX,USER_QQ,USER_CELLPHONE," \
"USER_MONEY,USER_STATUS,USER_PIC,USER_INTRO,date_format(USER_BIRTH, '%%Y-%%m-%%d'),USER_DEPTID , dept_id, dept_name , user_role " \
"from t_user left join job_dept on t_user.user_deptid=job_dept.dept_id where 1=1 " # where 1=1是为了便于增加and
if user.userName:
sql += " and user_name like %s " # 模糊查询
params.append('%' + user.userName + '%')
pass
if user.userSex:
sql += " and user_sex=%s"
params.append(user.userSex)
pass
startRow = (currentPage - 1)*pageSize
sql += "limit %s, %s"
params.append(startRow)
params.append(pageSize)
self.getConnection()
self.execute(sql, params)
result = self.fetch()
finally:
self.close()
return result
pass
def countUsers(self, user):
params = []
# sql语句和params就需要是动态
sql = "select count(*) from t_user u left join job_dept d on u.user_deptid=d.dept_id where 1=1 " # where 1=1是为了便于增加and
if user.userName:
sql += " and user_name like %s " # 模糊查询
params.append('%' + user.userName + '%')
pass
if user.userSex:
sql += " and user_sex=%s"
params.append(user.userSex)
pass
self.getConnection()
self.execute(sql, params)
result = self.fetchOne()
return result
pass
pass
- entity
- user.py(封装数据类)
# 封装数据类 VO:value object entity 类
class User():
def __init__(self):
self.__userId = None
self.__userName = None
self.__userPwd = None
self.__userSex = None
self.__userPic = None
self.__userBirth = None
self.__userIntro = None
self.__userDeptId = None
self.__userDeptName = None
self.__userRole = None
pass
@property
def userId(self):
return self.__userId
pass
@userId.setter
def userId(self, userId):
self.__userId = userId
pass
@property
def userName(self):
return self.__userName
pass
@userName.setter
def userName(self, userName):
self.__userName = userName
pass
@property
def userPwd(self):
return self.__userPwd
pass
@userPwd.setter
def userPwd(self, userPwd):
self.__userPwd = userPwd
pass
@property
def userSex(self):
return self.__userSex
pass
@userSex.setter
def userSex(self, userSex):
self.__userSex = userSex
pass
@property
def userPic(self):
return self.__userPic
pass
@userPic.setter
def userPic(self, userPic):
self.__userPic = userPic
pass
@property
def userBirth(self):
return self.__userBirth
pass
@userBirth.setter
def userBirth(self, userBirth):
self.__userBirth = userBirth
pass
@property
def userIntro(self):
return self.__userIntro
pass
@userIntro.setter
def userIntro(self, userIntro):
self.__userIntro = userIntro
pass
@property
def userDeptId(self):
return self.__userDeptId
pass
@userDeptId.setter
def userDeptId(self, userDeptId):
self.__userDeptId = userDeptId
pass
@property
def userDeptName(self):
return self.__userDeptName
pass
@userDeptName.setter
def userDeptName(self, userDeptName):
self.__userDeptName = userDeptName
pass
@property
def userRole(self):
return self.__userRole
pass
@userRole.setter
def userRole(self, userRole):
self.__userRole = userRole
pass
pass
- service
- userservice.py
from shopapp.dao.userdao import UserDao
from shopapp.entity.user import User
class UserService:
def findUserByUserName(self, userName):
userDao = UserDao()
return userDao.findUserByUserName(userName)
pass
def createUser(self, user):
userDao = UserDao()
return userDao.createUser(user)
pass
def findUserList(self, user):
userDao = UserDao()
userlist = []
result = userDao.findUserList(user)
for temp in result:
tuser = User()
tuser.userId = temp[0]
tuser.userName = temp[1]
tuser.userSex = temp[4]
userlist.append(tuser)
pass
return userlist
pass
def removeUser(self, userId):
userDao = UserDao()
return userDao.removeUser(userId)
pass
def findUserByUserId(self, userId):
userDao = UserDao()
result = userDao.findUserByUserId(userId)
user = None
if result:
user = User()
user.userId = result[0][0]
user.userName = result[0][1]
user.userSex = result[0][4]
user.userDeptId = result[0][13]
user.userDeptName = result[0][14]
pass
return user
pass
# 修改用户信息
def updateUser(self, user):
userDao = UserDao()
return userDao.updateUser(user)
pass
def findPageUserList(self, user, pageSize, currentPage):
userDao = UserDao()
return userDao.findPageUserList(user, pageSize, currentPage)
pass
def countUsers(self, user):
userDao = UserDao()
return userDao.countUsers(user)[0]
pass
pass
- jobtaskservice.py
from shopapp.dao.jobtaskdao import JobTaskDao
from shopapp.dao.jobpostiondao import JobPositionDao
from shopapp.entity.jobtask import JobTask
class JobTaskService:
def createJobTask(self, jobTask):
jobTaskDao = JobTaskDao()
return jobTaskDao.createJobTask(jobTask)
pass
def findJobTaskList(self, jobTask):
jobTaskDao = JobTaskDao()
jobTasklist = []
result = jobTaskDao.findJobTaskList(jobTask)
for temp in result:
tjobTask = JobTask()
tjobTask.taskId = temp[0]
tjobTask.taskTitle = temp[1]
tjobTask.taskURL = temp[4]
jobTasklist.append(tjobTask)
pass
return jobTasklist
pass
def removeJobTask(self, taskId):
jobTaskDao = JobTaskDao()
return jobTaskDao.removeJobTask(taskId)
pass
def findJobTaskByJobTaskId(self, taskId):
jobTaskDao = JobTaskDao()
result = jobTaskDao.findJobTaskByJobTaskId(taskId)
jobTask = None
if result:
jobTask = JobTask()
jobTask.taskId = result[0][0]
jobTask.taskTitle = result[0][1]
jobTask.taskURL = result[0][2]
pass
return jobTask
pass
# 修改用户信息
def updateJobTask(self, jobTask):
jobTaskDao = JobTaskDao()
return jobTaskDao.updateJobTask(jobTask)
pass
def findPageJobTaskList(self, jobTask, pageSize, currentPage):
jobTaskDao = JobTaskDao()
return jobTaskDao.findPageJobTaskList(jobTask, pageSize, currentPage)
pass
def countJobTasks(self, jobTask):
jobTaskDao = JobTaskDao()
return jobTaskDao.countJobTasks(jobTask)[0]
pass
def findJobMeanSalary(self):
jpd = JobPositionDao()
return jpd.findPositionClassify()
pass
pass
- 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
from django.db import models
class JobDept(models.Model):
dept_id = models.IntegerField(primary_key=True)
dept_name = models.TextField(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', max_length=32, blank=True, null=True) # Field name made lowercase.
user_pwd = models.CharField(db_column='USER_PWD', max_length=512, blank=True, null=True) # 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, on_delete=models.CASCADE,blank=True, null=True) # Field name made lowercase.
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.
# jobDept_dept_id
# jobDept_dept_name 偷偷生成
class Meta:
managed = False
db_table = 't_user'
- views.py
from django.shortcuts import render
from django.http.response import HttpResponse
from shopapp.service.userservice import UserService
from shopapp.service.jobtaskservice import JobTaskService
from shopapp.entity.jobtask import JobTask
from .models import TUser
from .models import JobDept
from django.core import serializers
import json
import os
import hashlib
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')
rememberMe = request.POST.get('rememberMe')
isEncode = request.POST.get("isEncode")
result = userService.findUserByUserName(userName)
# isLogin = False
# if result and (rememberMe == None or rememberMe =="false"):
# if result[0][2] == hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest():
# isLogin = True
# pass
# pass
# elif result and rememberMe == "true":
# if result[0][2] == userPwd:
# isLogin = True
# pass
# pass
# 记住密码
if isEncode=="0":
userPwd = hashlib.md5(userPwd.encode(encoding='utf-8')).hexdigest()
if result and userPwd==result[0][2]:
userItem = {}
userItem['userId'] = result[0][0]
userItem['userName'] = result[0][1]
userItem['userPic'] = result[0][9]
userItem['userRole'] = result[0][10]
request.session['userName'] = userName
request.session['user'] = userItem
response = render(request, 'main.html')
if rememberMe == "rem":
response.set_cookie('userName',userName)
response.set_cookie('userPwd', userPwd)
response.set_cookie('rememberMe', rememberMe)
pass
else:
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 = TUser.objects.create(
user_name = userDict.get('userName'), # 表单提交的数据使用request.form[]
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(requets):
requets.session.flush()
return render(requets,"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 = {}
print(userDict,'*******')
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':
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
starRow = (currentPage-1)*pageSize
endRow = currentPage*pageSize
result = query.filter().values('user_id','user_name','user_sex','jobDept_id','jobDept__dept_name')[starRow: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)
# data = json.loads(data)
data = []
for tempUser in result:
dictItem = {'pk':tempUser.get('user_id'),}
fieldItem = {'user_name':tempUser.get('user_name'),'user_sex':tempUser.get('user_sex'),'jobDept_id':tempUser.get('jobDept_id'),'user_deptname':tempUser.get('jobDept__dept_name')}
dictItem['fields'] = fieldItem
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'))
print(parentId)
if parentId<=0:
result = JobDept.objects.filter(dept_parentid__isnull=True).all()
pass
else:
result = JobDept.objects.filter(dept_parentid=parentId).all()
pass
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:# 保存文件到upload目录
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
- static
- js
- userdata.js
- js
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
currentPage = document.userForm.currentPage.value
pageSize = document.userForm.pageSize.value
userDeptId = document.userForm.userDeptId.value
}
$.ajax({
type: 'post', // 传数据的方式
url: '/ajaxuserinfo.do',
dataType: 'json', // xml、json、script、html
data: JSON.stringify({
'userName': userName, // $('#userName') == document.getElementById('userName')
'userSex': userSex,
'userId': userId,
'pageSize': pageSize,
'userDeptId': userDeptId,
'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 < data.userData.length; i++) {
htmlText += '<tr>' +
' <td align="center"><input type="checkbox" name="userId" value="' + data.userData[i].pk + '" /></td>\n' +
' <td>' + data.userData[i].pk + '</td>\n' +
' <td>' + data.userData[i].fields.user_name + '</td>\n' +
' <td>' + (data.userData[i].fields.user_sex == 1?'男':'女') + '</td>\n' +
' <td>' + data.userData[i].fields.user_deptname + '</td>\n' +
' <td style="width: 160px;">\n' +
' <button type="button" class="btn btn-danger" οnclick="getUserData(' + data.currentPage + ',' + data.pageSize + ',' + '\'del\'' + ',' + data.userData[i].pk + ')">删除</button>' +
' <button type="button" class="btn btn-info" οnclick="getUserData(' + data.currentPage + ',' + data.pageSize + ',' + '\'update\'' + ',' + data.userData[i].pk + ')">修改</button>' +
' </td>\n' +
' </tr>\n'
}
pageText = '<tr style="text-align: right;"><td colspan="6">' + '当前第' + data.currentPage + '页 总共有' + data.totalPage + '页 ';
if (data.currentPage <= 1) {
pageText += '首页 上一页 ';
} else {
pageText += '<a href="javascript:getUserData(1,10,\'search\', 0);">首页</a> ' +
'<a href="javascript:getUserData(' + (data.currentPage - 1) + ', 10, \'search\', 0);">上一页</a> ';
}
if (data.currentPage >= data.totalPage) {
pageText += '下一页 尾页 ';
} else {
pageText += '<a href="javascript:getUserData(' + (data.currentPage + 1) + ', 10, \'search\', 0);">下一页</a> ' +
'<a href="javascript:getUserData(' + data.totalPage + ', 10, \'search\', 0);">尾页</a> ';
}
pageText += '总共有' + data.counts + '条 </td></tr>'
$('#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.userSex.value = data.userData.userSex
document.userForm.userId.value = data.userData.userId
console.log(data.userData.userDeptName)
$('#userDept').html(data.userData.userDeptName)
document.userForm.currentPage.value = data.currentPage
document.userForm.pageSize.value = data.pageSize
document.userForm.userDeptId.value = data.userDeptId
if (data.userDeptId =='undefined'){
document.userForm.userDeptId.value = 0
}
$('#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: '/getdeptinfo.do',
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 = '<option value="-99">选择部门</option>'
for(var i=0;i<data.data.length;i++){
htmlText += '<option value="' + data.data[i].pk +'">' + data.data[i].fields.dept_name + '</option>'
}
$('#parentDept').html(htmlText)
}
}else{
if(data.code == 1 && grade == 2){
if(document.getElementById('gradeTwoDept')){
$('#gradeTwoDept').remove()
}
if(document.getElementById('gradeTreeDept')){
$('#gradeTreeDept').remove()
}
htmlText = '<select id="gradeTwoDept" οnchange="getDeptList(-1, this,3)" >'
htmlText += '<option value="-99">选择子部门</option>'
for(var i=0;i<data.data.length;i++){
htmlText += '<option value="' + data.data[i].pk +'">' + data.data[i].fields.dept_name + '</option>'
}
htmlText += "</select>"
$('#deptContainer').append(htmlText)
}else if(data.code == 1 && grade == 3){
if(document.getElementById('gradeTreeDept')){
$('#gradeTreeDept').remove()
}
htmlText = '<select id="gradeTreeDept" οnchange="getDeptList(-1, this, 4)" >'
htmlText += '<option value="-99">选择子部门</option>'
for(var i=0;i<data.data.length;i++){
htmlText += '<option value="' + data.data[i].pk +'">' + data.data[i].fields.dept_name + '</option>'
}
htmlText += "</select>"
$('#deptContainer').append(htmlText)
}
}
}
})
}
$(document).ready(
function(){
getUserData(1, 10, 'search', 0)
}
)
- jaotask.js
function getJobTaskData(currentPage, pageSize, opr, taskId) {
var taskTitle = document.searchForm.taskTitle.value
var taskURL = document.searchForm.taskURL.value
if(opr == 'del'){
if(!confirm('确定要删除吗?')){
return false
}
}else if(opr == 'submitUpdate'){
taskTitle = document.taskForm.taskTitle.value
taskURL = document.taskForm.taskURL.value
taskId = document.taskForm.taskId.value
currentPage = document.taskForm.currentPage.value
pageSize = document.taskForm.pageSize.value
$('#modal-default').modal('hide')
}
$.ajax({
type: 'post', // 传数据的方式
url: '/ajaxjobtaskinfo.do',
dataType: 'json', // xml、json、script、html
data:JSON.stringify({
'taskTitle': taskTitle, // $('#taskTitle') == document.getElementById('taskTitle')
'taskURL' : taskURL,
'taskId': taskId,
'pageSize': pageSize,
'currentPage': currentPage,
'opr': opr
}),
error: function(xhr, err){
alert('请求失败,请检查,' + err + '!')
},
success: function(data, textStatus){ // success对应的回调函数的第一个参数,是服务器返回的数据
// 查询后、删除后、修改后都走这个if
if(data.code == 1 && opr != 'update'){
var htmlText = ""
for(var i =0;i <data.jobTaskData.length;i++){
htmlText += '<tr>' +
' <td align="center"><input type="checkbox" name="taskId" value="'+ data.jobTaskData[i][0] +'" /></td>\n' +
' <td>' + data.jobTaskData[i][0] + '</td>\n' +
' <td>' + data.jobTaskData[i][1] + '</td>\n' +
' <td style="width: 500px;word-break: break-all;">' + data.jobTaskData[i][2] + '</td>\n' +
' <td style="width: 160px;">\n' +
' <button type="button" class="btn btn-danger" οnclick="getJobTaskData('+ data.currentPage +',' + data.pageSize + ','+ '\'del\''+',' + data.jobTaskData[i][0] +')">删除</button>' +
' <button type="button" class="btn btn-info" οnclick="getJobTaskData('+ data.currentPage +',' + data.pageSize + ','+ '\'update\''+',' + data.jobTaskData[i][0] +')">修改</button>'+
' </td>\n' +
' </tr>\n'
}
pageText = '<tr style="text-align: right;"><td colspan="5">'+ '当前第' + data.currentPage + '页 总共有' + data.totalPage + '页 ';
if(data.currentPage <= 1) {
pageText += '首页 上一页 ';
}else{
pageText += '<a href="javascript:getJobTaskData(1,10,\'search\', 0);">首页</a> ' +
'<a href="javascript:getJobTaskData(' + (data.currentPage - 1) + ', 10, \'search\', 0);">上一页</a> ';
}
if(data.currentPage >= data.totalPage){
pageText += '下一页 尾页 ';
}else {
pageText += '<a href="javascript:getJobTaskData(' + (data.currentPage + 1) + ', 10, \'search\', 0);">下一页</a> ' +
'<a href="javascript:getJobTaskData(' + data.totalPage + ', 10, \'search\', 0);">尾页</a> ';
}
pageText +='总共有'+ data.counts + '条 </td></tr>'
$('#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("操作成功")
}else if(opr != 'search' && data.updateResult <= 0){
alert("操作失败")
}
}else if(data.code == 1 && opr == 'update'){
document.taskForm.taskTitle.value = data.jobTaskData.taskTitle
document.taskForm.taskURL.value = data.jobTaskData.taskURL
document.taskForm.taskId.value = data.jobTaskData.taskId
document.taskForm.currentPage.value = data.currentPage
document.taskForm.pageSize.value = data.pageSize
$('#modal-default').modal()
}
}
});
}
$(document).ready(
function(){
getJobTaskData(1, 10, 'search', 0)
}
)
- templates
- systeminfo
- userinfo.html
- systeminfo
{% include 'top.html' %}
{% include 'left.html' %}
{% load static %}
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1>
系统管理
<small>用户信息管理</small>
</h1>
<ol class="breadcrumb">
<li><a href="#"><i class="fa fa-dashboard"></i> 系统管理</a></li>
<li><a href="#">系统用户</a></li>
<li class="active">用户信息管理</li>
</ol>
</section>
<!-- Main content -->
<section class="content">
<div class="row">
<div class="col-xs-12">
<div class="box">
<div class="box-header">
<h3 class="box-title">用户信息</h3>
</div>
<!-- /.box-header -->
<div class="box-body">
<form method="post" name="searchForm" class="form-inline">
<div class="form-group">
<div class="form-group">
<label class="control-label" for="userName">用户名:</label>
<input type="text" name="userName" class="form-control" id="userName"/>
</div>
<div class="form-group">
<label for="userSex" class="control-label">性别:
<input type="radio" name="userSex" value="1">男
<input type="radio" name="userSex" value="2">女
</label>
</div>
<input type="hidden" name="currentPage" value="1"/>
<input type="hidden" name="pageSize" value="10"/>
<button class="btn btn-primary" type="button" οnclick="getUserData(1, 10, 'search', 0)">查询</button>
<button class="btn btn-primary" type="button" οnclick="javascript:document.searchForm.reset();">重置</button>
</div>
</form>
<table class="table table-responsive table-bordered">
<caption>{{ message }}</caption>
<thead>
<tr>
<th style="text-align: center;width: 80px;">
<input type="button" value="全选"/>
</th>
<th>用户ID</th>
<th>用户名</th>
<th>用户性别</th>
<th>部门</th>
<th>操作</th>
</tr>
</thead>
<tbody id="dataBody">
</tbody>
</table>
<div class="modal fade" id="modal-default">
<div class="modal-dialog">
<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">修改用户信息</h4>
</div>
<div class="modal-body">
<form method="post" name="userForm" >
<div class="form-group">
<label for="userName" class="control-label">用户名:</label>
<input type="text" name="userName" class="form-control"/>
</div>
<div class="form-group">
<label for="userSex" class="control-label">性别:
<input type="radio" id="male" name="userSex" value="1">男
<input type="radio" id="female" name="userSex" value="2">女
</label>
</div>
<div class="form-group">
<label for="userDept" class="control-label">部门:
<span id="userDept"></span>
<input type="hidden" name="userDeptId" id="userDeptId" value='0'>
<div id="deptContainer">
<select id="parentDept" οnchange="getDeptList(-1, this, 2)">
<option value="-99">选择部门</option>
</select>
</div>
</label>
</div>
<input type="hidden" name="userId"/>
<input type="hidden" name="currentPage" value="1"/>
<input type="hidden" name="pageSize" value="10"/>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" οnclick="getUserData(1, 10, 'submitUpdate', 0)">保存</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
{% include 'footer.html' %}
<script type="text/javascript" src="{% static 'js/formvalidator.js' %}"></script>
<script type="text/javascript" src="{% static 'js/userdata.js' %}"></script>
- jobinfo
- jobtaskinfo.html
{% include 'top.html' %}
{% include 'left.html' %}
{% load static %}
<div class="content-wrapper">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1>
系统管理
<small>任务信息管理</small>
</h1>
<ol class="breadcrumb">
<li><a href="#"><i class="fa fa-dashboard"></i> 采集管理</a></li>
<li><a href="#">系统任务</a></li>
<li class="active">任务信息管理</li>
</ol>
</section>
<!-- Main content -->
<section class="content">
<div class="row">
<div class="col-xs-12">
<div class="box">
<div class="box-header">
<h3 class="box-title">任务信息</h3>
</div>
<!-- /.box-header -->
<div class="box-body">
<form method="post" name="searchForm" class="form-inline">
<div class="form-group">
<div class="form-group">
<label class="control-label" for="taskTitle">任务名:</label>
<input type="text" name="taskTitle" class="form-control" id="taskTitle"/>
</div>
<div class="form-group">
<label class="control-label" for="taskURL">任务地址: </label>
<input type="text" name="taskURL" class="form-control" id="taskURL" />
</div>
<input type="hidden" name="currentPage" value="1"/>
<input type="hidden" name="pageSize" value="10"/>
<button class="btn btn-primary" type="button" οnclick="getJobTaskData(1, 10, 'search', 0)">查询</button>
</div>
</form>
<table class="table table-responsive table-bordered">
<caption>{{ message }}</caption>
<thead>
<tr>
<th style="text-align: center;width: 80px;">
<input type="button" value="全选"/>
</th>
<th>任务ID</th>
<th>任务名称</th>
<th style="width: 300px;word-wrap: break-word;overflow: hidden;">任务URL地址</th>
<th>操作</th>
</tr>
</thead>
<tbody id="dataBody">
</tbody>
</table>
<div class="modal fade" id="modal-default">
<div class="modal-dialog">
<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">修改任务信息</h4>
</div>
<div class="modal-body">
<form method="post" name="taskForm">
任务名称:<input type="text" name="taskTitle" />
采集URL地址: <input type="text" name="taskURL" />
<input type="hidden" name="taskId"/>
<input type="hidden" name="currentPage" value="1"/>
<input type="hidden" name="pageSize" value="10"/>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default pull-left" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" οnclick="getJobTaskData(1, 10, 'submitUpdate', 0)">保存</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
{% include 'footer.html' %}
<script type="text/javascript" src="{% static 'js/jobtask.js' %}"></script>
- manage.py(程序启动入口)
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoproject.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
还请大神,多多指点。