安装django
pip install django
创建django项目
django-admin startproject mysite 若用pycharm 删除setting.py中DIRS中的和templates
创建app
python manage.py startapp app01
注册setting中
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': []#记得删除内容
INSTALLED_APPS={
'app01.apps.App01.Config'
}
注意:不注册app下的models.py写类时,无法创建表
配置静态文件路径 模板路径 放app目录下
创建static文件
引用
html
{% load static %}
<link rel="stylesheet" href="{% static 'plugins/bootstrap-datepicker/css/bootstrap-datepicker.min.css' %}">
模板语法
views
def tpl(request): name='han' roles=['管理员','CEO','保安'] data_list=[{'name':'果汁','salary':'100000','role':'CEO'}, {'name':'李白','salary':'100000','role':'CEO'}, {'name':'杜甫','salary':'100000','role':'CEO'}] user_info={'name':'果汁','salary':'100000','role':'CEO'} return render(request,'tpl.html',{'n1':name,'n2':roles,'n3':user_info,'n4':data_list})
html
<h1>模板语法</h1> <div>{{ n1 }}</div> <div>{{ n2 }}</div> <div>{{ n2.0 }}</div> <div>{{ n2.1 }}</div> <div> {% for item in n2 %} <span>{{ item }}</span> {% endfor %} </div> <hr/> {{ n3 }} {{ n3.name }} {{ n3.salary }} <ul> {% for k,v in n3.items %} <li>{{ k }}={{ v }}</li> <li></li> {% endfor %} </ul> <hr/> {{ n4.0 }} {{ n4.0.name }} {% for item in n4 %} <div>{{ item.name }} {{ item.salary }}</div> {% endfor %} <hr/> {% if n1 == 'han' %} <h1>youxiu</h1> {% elif n1 == 'ha'%} <h1>哈哈</h1> {% else %} <h1>厉害</h1> {% endif %}
请求和响应
view
# print(request.method)#获取请求方式
# print(request.GET)#url上传值
# print(request.POST)#请求体中提交数据
# return HttpResponse('返回内容')
# return render(request,'something.html',{'title':'来了'})#读取html中内容渲染(替换)字符串,返回浏览器
return redirect('https://www.baidu.com')#响应
html
<form method="post" action="/login/"> #action 为发请求的地址 {% csrf_token %} #必须加 <input type="text" name="user" placeholder="用户名"> <input type="password" name="pwd" placeholder="密码"> <input type="submit" value="提交"> <span style="color: red">{{ error_msg }}</span>
配置数据库相关操作(mysql)
第三方模块
pip install mysqlclient
先去mysql创建数据库
配置数据库连settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'wb final',#数据库名字 'USER':'root', 'PASSWORD':'123456', 'HOST':'localhost',#那台机器安装的mysql 'PORT':3306, } }
在app下的models.py写
from django.db import models
class Order(models.Model): oid=models.CharField(verbose_name='订单号',max_length=64) title=models.CharField(verbose_name='名称',max_length=32) price=models.IntegerField(verbose_name='价格') status_choices=( (1,'待支付'), (2,'已支付'), ) status=models.SmallIntegerField(verbose_name='状态',choices=status_choices,default=1) admin=models.ForeignKey(verbose_name='管理员',to='Admin',on_delete=models.CASCADE) # CASCADE级联删除删除相关的
class Department(models.Model): title = models.CharField(verbose_name='标题', max_length=32) def __str__(self):#views中生成的是对象,初始化成标题 return self.title
执行命令
python manage.py makemigrations
python manage.py migrate
在urls.py 路由(url和函数的对应关系)
from app01.views import depart, user, pretty, admin, account, task,order
path('order/list/',order.order_list),
#传递nid给函数 html循环显示<a class="btn btn-danger btn-xs" href="/user/{{ obj.id }}/delete/">删除</a>
path('pretty/<int:nid>/delete/', pretty.pretty_delete),
views.py 视图函数,编写业务逻辑
from django.shortcuts import render def order_list(request): #优先去项目根目录templates中寻找 #根据app注册的顺序去templates目录下寻找 return render(request,'order_list.html')
templates目录 编写html 模板 (继承 {% static ' xx'%} )
app中新建templates 放入xx.html
html模板语法
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"> <style> .navbar { border-radius: 0; } </style> {% block css %}{% endblock %} </head> <body> <div> {% block content %}{% endblock %} </div> <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script> <script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script> {% block js %}{% endblock %} </body> </html>
别的html继承模板
{% extends 'layout.html' %} {% block content %} <div class="container"> <div>
{% for obj in queryset %} <tr> <th>{{ obj.id }}</th> <td>{{ obj.create_time|date:'Y-m-d' }}</td> <td>{{ obj.get_gender_display }}</td> <td>{{ obj.depart.title }}</td> <td> <a class="btn btn-primary btn-xs" href="/user/{{ obj.id }}/edit/">编辑</a> <a class="btn btn-danger btn-xs" href="/user/{{ obj.id }}/delete/">删除</a> </td> </tr>
<input type="button" value="新建订单" class="btn btn-primary"> </div> </div> {% endblock %}
{% block js %}{% endblock %}
ModelForm Form组件
model
status_choices=( (1,'待支付'), (2,'已支付'), ) status=models.SmallIntegerField(verbose_name='状态',choices=status_choices,default=1)
html
<td>{{ obj.get_level_display }}</td> #显示数据库保存的字段
form
views.py
from django import forms class MyForm(forms.Form): oid= forms.CharFiled(widget=forms.Input) //widget插件生成input标签 title=forms.CharFiled(widget=forms.Input) def user_add(request): if request.method == 'GET': form = MyForm() return render(request,'xx.html', {'form':form})
html
<form method="post"> {%csrf_token%} {% for item in form %} <option value="{{ item.id }}">{{ item.title }}</option> {% endfor %} </form>
modelform
views.py
from django import forms class MyForm(forms.ModelForm): xx=forms.CharField()#新建字段 class Meta: model=models.order //models中类的名字 fields=['oid','title']#展示部分 # fields='__all__'#展示所有 widget={ 'name':forms.TextInput(attrs={'class':'form-control'}), }#调对话框的样字
exclude=['oid']#排除oid
def user_edit(request, nid): row_object = models.UserInfo.objects.filter(id=nid).first() if request.method == 'GET': #url传值 form = UserModelForm(instance=row_object) #instance更新操作 页面填入的值 return render(request, 'user_edit.html', {'form': form}) form = UserModelForm(data=request.POST, instance=row_object) if form.is_valid(): #默认是保存所有 若增加输入之外form.instance.字段名=值 form.save() return redirect('/user/list/') return render(request, 'user_edit.html', {'form': form})
上传图片
启用media
url中配置:...
from django.urls import re_path
from django.views.static import serve
from django.conf import settings
urlpatterns = [
re_path(r'^media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT},name='media'),
...
]
settings.py 需要新增如下
import os MEDIA_ROOT = os.path.join(BASE_DIR,"media")#app下创建media文件夹 MEDIA_URL = "/media/"
forms案例
views
from django.shortcuts import render, HttpResponse import os from app01 import models from django.conf import settings def upload_list(request): if request.method == 'GET': return render(request, 'upload_list.html') # print(request.POST) #请求体中数据 # print(request.FILES) #请求发过来的文件 file_object = request.FILES.get('avatar') f = open(file_object.name,mode='wb') for chunk in file_object.chunks(): f.write(chunk) f.close() return HttpResponse('...') from django import forms from app01.utils.bootstrap import BootStrapForm class UpForm(BootStrapForm): bootstrap_exclude_filelds = ['img'] name=forms.CharField(label='姓名') age=forms.IntegerField(label='年龄') img=forms.FileField(label='头像') def upload_form(request): title='Form上传' if request.method=='GET': form=UpForm() return render(request,'upload_form.html',{'form':form,'title':title}) form=UpForm(data=request.POST,files=request.FILES) if form.is_valid(): #读取图片内容,写入到文件夹并获取文件路径中 image_object=form.cleaned_data.get('img') # media_path=os.path.join(settings.MEDIA_ROOT,image_object.name) media_path = os.path.join('media', image_object.name) f=open(media_path,mode='wb') for chunk in image_object.chunks(): f.write(chunk) f.close() #将图片文件路径写入到数据库 models.Boss.objects.create( name=form.cleaned_data['name'], age=form.cleaned_data['age'], img=media_path, ) return HttpResponse('..') return render(request, 'upload_form.html', {'form': form, 'title': title})
modelform
models
class City(models.Model): name = models.CharField(verbose_name='名称', max_length=32) count = models.IntegerField(verbose_name='人口') #数据库也是Charfield,自动保存 img = models.FileField(verbose_name='Logo', max_length=128,upload_to='city/')
定义modelform
from app01.utils.bootstrap import BootStrapModelForm class UpModelForm(BootStrapModelForm): bootstrap_exclude_filelds = ['img'] class Meta: model=models.City fields='__all__'
views
def upload_model_form(request): title='Modelform上传文件' if request.method=='GET': form=UpModelForm() return render(request, 'upload_form.html', {'form': form, 'title':title }) form=UpModelForm(data=request.POST,files=request.FILES) if form.is_valid(): #对于文件自动保存 #字段+上传路径写入到数据库 form.save() return return render(request, 'upload_form.html', {'form': form, 'title': title})
bootsrtip组件
views
from django import forms class Bootstrap: def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for name, field in self.fields.items():#循环找到所有字段 添加class类和标签内容 if field.widget.attrs:#字段中有属性保留无则添加 field.widget.attrs['class']='form-control' field.widget.attrs['placeholder']=field.label else: field.widget.attrs = {"class": "form-control", 'placeholder':field.label } class BootStrapModelForm(Bootstrap,forms.ModelForm): pass class BootStrapForm(Bootstrap,forms.Form): pass
生成html标签(生成默认值)
<form method="post"> {% for field in form %} {{ field.label }}:{{field}} {% endfor %} </form>
请求数据校验
view
def user_model_form_add(request): if request.method == 'GET': form = UserModelForm() return render(request, 'user_model_form_add.html', {'form': form}) form = UserModelForm(data=request.POST) #提交的数据进行校验 if form.is_valid(): form.save() return redirect('/user/list/') #页面显示错误信息 return render(request, 'user_model_form_add.html', {'form': form})
html
<span style="color:red;">{{ field.errors.0 }}</span>
错误信息 改为中文显示 settings
LANGUAGE_CODE = 'zh-hans'
加密md5
views
from django.conf import settings import hashlib def md5(data_string): obj=hashlib.md5(settings.SECRET_KEY.encode('utf-8'))#加盐 obj.update(data_string.encode('utf-8')) return obj.hexdigest()
保存到数据库(ModelForm)
view
form.save()
获取错误信息
views
if form.is_valid():
form.save()
return redirect('/user/list/')
#页面显示错误信息 return render(request, 'user_model_form_add.html', {'form': form})
views
class PrettyEditModelForm(BootStrapModelForm): # 验证方式一 正则表达式 mobile = forms.CharField( label='手机号', validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')], ) # mobile=forms.CharField(disabled=True,label='手机号') class Meta: model = models.PrettyNum fields = ['mobile', 'price', 'level', 'status'] # fields='__all__' # 验证方式二 钩子方法 def clean_mobile(self): #clean_字段名 txt_mobile = self.cleaned_data['mobile'] #表单post传递的值 exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists() #self.instance 为当前输入对象 pk 为id if exists: raise ValidationError('手机号已存在') return txt_mobile
Cookie和Session,用户登录信息保存
中间件,基于中间件实现用户认证,基于:process_request
setting种注册
MIDDLEWARE = [ 'app01.middleware.auth.AuthMiddleware', ]
views
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse,redirect class AuthMiddleware(MiddlewareMixin): def process_request(self,request):#无返回值向后走(返回none) if request.path_info in ['/login/','/image/code/']:#request.path_info当前用户请求的url return info_dict=request.session.get('info')#获取登录信息 if info_dict: return return redirect('/login/')#有返回值则执行
验证码
pip install pillow
生成图片文字
import random from PIL import Image,ImageDraw,ImageFont,ImageFilter def check_code(width=120, height=35, char_length=5, font_file='MONACO.TTF', font_size=28): code = [] img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255)) draw = ImageDraw.Draw(img, mode='RGB') def rndChar(): """ 生成随机字母 :return: """ return chr(random.randint(65, 90)) def rndColor(): """ 生成随机颜色 :return: """ return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255)) # 写文字 font = ImageFont.truetype(font_file, font_size) for i in range(char_length): char = rndChar() code.append(char) h = random.randint(0, 4) draw.text([i * width / char_length, h], char, font=font, fill=rndColor()) # 写干扰点 for i in range(40): draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) # 写干扰圆圈 # for i in range(40): # draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) # x = random.randint(0, width) # y = random.randint(0, height) # draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor()) # 画干扰线 # for i in range(5): # x1 = random.randint(0, width) # y1 = random.randint(0, height) # x2 = random.randint(0, width) # y2 = random.randint(0, height) # # draw.line((x1, y1, x2, y2), fill=rndColor()) img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) return img, ''.join(code)
校验
from django.shortcuts import render,redirect,HttpResponse from django import forms from app01.utils.bootstrap import BootStrapForm from app01.utils.encrypt import md5 from app01 import models from app01.utils.code import check_code from io import BytesIO
def login(request): if request.method == 'GET': form = LoginForm() return render(request, 'login.html', {'form': form}) form = LoginForm(data=request.POST) if form.is_valid(): user_input_code = form.cleaned_data.pop('code') code = request.session.get('image_code', '') if code.upper() != user_input_code.upper(): form.add_error('code', '验证码错误') return render(request, 'login.html', {'form': form}) admin_object = models.Admin.objects.filter(**form.cleaned_data).first() if not admin_object: form.add_error('password','用户名或密码错误') return render(request, 'login.html', {'form': form}) request.session['info']={'id':admin_object.id,'name':admin_object.username} #session保存七天 request.session.set_expiry(60 * 60 * 24 * 7) return redirect('/admin/list/') return render(request, 'login.html', {'form': form}) def image_code(request): img,code_string=check_code() request.session['image_code']=code_string #session 设置60s超时 request.session.set_expiry(60) stream=BytesIO() img.save(stream,'png') return HttpResponse(stream.getvalue())
ORM操作
views
删除表数据:
# models.Department.objects.filter(id=3).delete()
models.Department.objects.all().delete()
查询表数据
#data_list=[对象,对象。对象] Queryset类型
# data_list =Department.objects.all()
# for obj in data_list:
data_user =UserInfo.objects.filter(id=1).first()
def pretty_list(request): data_dict = {} search_data = request.GET.get('q', '')#去html中name='q'拿 if search_data: data_dict['mobile__contains'] = search_data #mobile__contains model中mobile字段 queryset = models.PrettyNum.objects.filter(**data_dict).order_by('-level') return render(request, 'pretty_list.html', context)
更新数据
models.UserInfo.objects.all().update(password=999) row_object=models.UserInfo.objects.filter(name="zzm").update(age=000)
return render(request,'depart_edit.html',{'row_object':row_object})
title =request.POST.get('title') models.Department.objects.filter(id=nid).update(title=title)
return redirect('/depart/list')
ORM字段
1.常用字段类型
charField:字符型,class employee{ name = models.charField(字段属性)}
EmailField:邮箱类型,实际上还是字符类型,只不过是提供了邮箱的格式检验
TextFeild:文本类型,存储大段文本字符串
IntegerFeild:整数类型
DateFeild:日期字段 auto_now:自动保存当前时间
TimeFeild:时间字段
DateTimeFeild:结合了日期和时间的字段
FileField:文件字段,保存上传文件的路径
2.常用的字段属性
unique:unique=true,表示该字段不能有重复值
default:设置字段默认值
auto_now:自动保存当前时间
blank=True,null=True:允许字段为空
verbose_name:命名
max_length:最大长度
3.ORM常用操作函数
all()获取全部记录
filter()返回指定记录
exclude() 返回不符合条件的记录
order_by(- id) 排序,如果字段名中加入减号,代表该字段倒序
distinct 去掉记录中完全一样的 重复记录
values 返回一个字典类型的序列,values_list,返回元组序列
get,first,last
分页组件
views
'''分页组件 视图函数中: def pretty_list(request): 1.筛选数据 queryset = models.PrettyNum.objects.all() 实例化分页对象 page_object=Pagination(request,queryset) context={'queryset': page_object.page_queryset,#分完页的数据 'search_data': search_data, 'page_string': page_object.html(),#生成页码 } return render(request, 'pretty_list.html',context) html: for obj in queryset {{obj.xx}} endfor <ul class="pagination"> {{ page_string }} </ul> ''' from django.utils.safestring import mark_safe #包裹成安全的 class Pagination(object): def __init__(self, request, queryset, page_size=10, page_param='page', plus=5): ''' :param request:请求的对象 :param queryset: 符合条件的数据据此分页处理 :param page_size: 每页多少数据 :param page_param: url中获取分页参数 :param plus: 前后几页 ''' from django.http.request import QueryDict import copy query_dict=copy.deepcopy(request.GET) query_dict._mutable=True #urlencode顺利拼接 self.query_dict=query_dict self.page_param=page_param page = request.GET.get(page_param, '1') if page.isdecimal(): #若是数字 page = int(page) else: page = 1 self.page = page self.page_size = page_size self.start = (page - 1) * page_size self.end = page * page_size self.page_queryset = queryset[self.start:self.end] # 数据条数 total_count = queryset.count() # 总页码 total_page_count, div = divmod(total_count, page_size) #相除取余数 % if div: total_page_count += 1 self.total_page_count = total_page_count self.plus = plus def html(self): if self.total_page_count < 2 * self.plus + 1: start_page = 1 end_page = self.total_page_count else: if self.page <= self.plus: start_page = 1 end_page = 2 * self.plus + 1 else: if (self.page + self.plus) > self.total_page_count: start_page = self.total_page_count - 2 * self.plus end_page = self.total_page_count else: start_page = self.page - self.plus end_page = self.page + self.plus # 页码 page_str_list = [] self.query_dict.setlist(self.page_param,[1]) #setlist设置自己搜索条件 page_str_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode())) #urlencode拼接字符串 if self.page > 1: self.query_dict.setlist(self.page_param, [self.page-1]) prev = '<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode()) else: self.query_dict.setlist(self.page_param, [1]) prev = '<li><a href="?{}">上一页</a></li>'.format(1) page_str_list.append(prev) #页面 for i in range(start_page, end_page + 1): self.query_dict.setlist(self.page_param, [i]) if i == self.page: ele = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i) else: ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i) page_str_list.append(ele) if self.page < self.total_page_count: self.query_dict.setlist(self.page_param, [self.page+1]) prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()) else: self.query_dict.setlist(self.page_param, [self.total_page_count]) prev = '<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()) page_str_list.append(prev) self.query_dict.setlist(self.page_param, [self.total_page_count]) page_str_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode())) search_string = ''' <li> <form style="float: left;margin-left: -1px" method="get"> <input style="position: relative;float: left;display: inline-block;width: 80px;border-radius: 0;" type="text" name="page" class="form-control" placeholder="页码"> <button style="border-radius: 0" class="btn btn-default" type="submit">跳转</button> </form> </li> ''' page_str_list.append(search_string) page_string = mark_safe(''.join(page_str_list))#mark_safe安全显示 return page_string
ajax请求
html
{% extends 'layout.html' %} {% block content %} <div class="container"> <div style="margin-bottom: 10px"> <input id="btnAdd" type="button" value="新建订单2" class="btn btn-primary"> <input id="btnAdd" type="button" value="新建订单1" class="btn btn-primary" data-toggle="modal" data-target="#myModal"> </div> <div class="panel panel-default"> <!-- Default panel contents --> <div class="panel-heading"> <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> 订单列表 </div> <!-- Table --> <table class="table table-bordered"> <thead> <tr> <th>id</th> <th>订单号</th> <th>名称</th> <th>价格</th> <th>状态</th> <th>管理员</th> <th>操作</th> </tr> </thead> <tbody> {% for obj in queryset %} <tr uid="{{ obj.id }}"> <th>{{ obj.id }}</th> <td>{{ obj.oid }}</td> <td>{{ obj.title }}</td> <td>{{ obj.price }}</td> <td>{{ obj.get_status_display }}</td> <td>{{ obj.admin.username }}</td> <td> <input uid="{{ obj.id }}" type="button" class="btn btn-primary btn-xs btn-edit" value="编辑"> <input uid="{{ obj.id }}" class="btn btn-danger btn-xs btn-delete" type="button" value="删除"> </td> </tr> {% endfor %} </tbody> </table> </div> <ul class="pagination"> {{ page_string }} </ul> </div> {# 新建对话框#} <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <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" id="myModalLabel">新建</h4> </div> <div class="modal-body"> <form id="formAdd"> <div class="clearfix"> {% for field in form %} <div class="col-xs-6"> <div class="form-group" style="position: relative;margin-bottom: 20px;"> <label>{{ field.label }}</label> {{ field }} <span class="error-msg" style="color: red;position: absolute;"></span> </div> </div> {% endfor %} </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">取消</button> <button id="btnSave" type="button" class="btn btn-primary">保存</button> </div> </div> </div> </div> {# 删除对话框#} <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="alert alert-danger alert-dismissible fade in" role="alert"> <h4>是否确定删除?</h4> <p>删除后所有关联的的相关数据都会被删除</p> <p style="text-align: right;"> <button id="btnConfirmDelete" type="button" class="btn btn-danger">确定</button> <button type="button" class="btn btn-default" data-dismiss="modal">取消</button> </p> </div> </div> </div> </div> {% endblock %} {% block js %} <script type="text/javascript"> var DELETE_ID; var EDIT_ID; $(function () { bindBtnAddEvent(); bindBtnSaveEvent(); bindBtnDeleteEvent(); bindBtnConfirmDeleteEvent(); bindBtnEditEvent(); }) function bindBtnAddEvent() { $('#btnAdd').click(function () { {#将正在编辑的id设置为空#} EDIT_ID = undefined; {#清除对话框中数据#} $('#formAdd')[0].reset(); //修改对话框标题 $('#myModalLabel').text('新建'); //点击新建显示对话框 $('#myModal').modal('show'); }); } function bindBtnSaveEvent() { $('#btnSave').click(function () { //清除错误信息 错误信息的class $('.error-msg').empty(); if (EDIT_ID) { {# 编辑#} doEdit(); } else { {# 添加#} doAdd(); } }); } function doEdit() { $.ajax({ url: "/order/edit/" + "?uid=" + EDIT_ID, type: 'post', data: $('#formAdd').serialize(), {#表单的信息#} dataType: 'JSON', success: function (res) { if (res.status) { {#清空表单 $('#formAdd')为jquery对象 $('#formAdd')[0]是dom对象#} $('#formAdd')[0].reset(); {#关闭对话框#} $('#myModal').modal('hide'); {#刷新页面#} location.reload(); } else { if (res.tips) { alert(res.tips); } else { {#错误信息显示#} $.each(res.error, function (name, errorList) { $('#id_' + name).next().text(errorList[0]); }) } } } }) } function doAdd() { //向后台发送 添加的ajax请求 $.ajax({ url: "/order/add/", type: 'post', data: $('#formAdd').serialize(), {#表单的信息#} dataType: 'JSON', success: function (res) { if(res.status) { alert('添加成功'); {#清空表单 $('#formAdd')为jquery对象 $('#formAdd')[0]是dom对象#} $('#formAdd')[0].reset(); {#关闭对话框#} $('#myModal').modal('hide'); {#刷新页面#} location.reload(); } else { {#错误信息显示#} $.each(res.error, function (name, errorList) { $('#id_' + name).next().text(errorList[0]); }) } } }) } function bindBtnDeleteEvent() { $('.btn-delete').click(function () { {#alert('点击了删除');#} $('#deleteModal').modal('show'); {# 获取当前行的id赋值给全局变量#} DELETE_ID = $(this).attr('uid'); }); } function bindBtnConfirmDeleteEvent() { $('#btnConfirmDelete').click(function () { {# 点击确认按钮,全局变量中设置的要删除的id发送到后台#} $.ajax({ url: '/order/delete/', type: 'GET', data: { uid: DELETE_ID }, dataType: 'JSON', success: function (res) { if (res.status) { //隐藏删除 {#$('#deleteModal').modal('hide');#} //页面上删除当前一行 //删除id的置空 {#DELETE_ID=0;#} location.reload(); } else { //删除失败 alert(res.error); } } }) }); } function bindBtnEditEvent() { $('.btn-edit').click(function () { {#清除对话框中数据#} $('#formAdd')[0].reset(); var uid = $(this).attr('uid'); EDIT_ID = uid; //发送ajax去后端获取向相关数据 /order/detail/?uid= $.ajax({ url: '/order/detail/', type: 'get', data: { uid: uid }, dataType: 'JSON', success: function (res) { if (res.status) { {#数据赋值到对话框的标签中#} $.each(res.data, function (name, value) { $('#id_' + name).val(value); }) //修改对话框标题 $('#myModalLabel').text('编辑'); //点击编辑显示对话框 $('#myModal').modal('show'); } else { alert(res.error); } } }) //对话框中显示 }); } </script> {% endblock %}
函数order.py
import random from datetime import datetime from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt from app01 import models from app01.utils.bootstrap import BootStrapModelForm from app01.utils.pagination import Pagination class OrderModelForm(BootStrapModelForm): class Meta: model = models.Order # fields='__all__' exclude = ['oid', 'admin'] # 排除oid def order_list(request): queryset = models.Order.objects.all().order_by('-id') page_object = Pagination(request, queryset) form = OrderModelForm() context = { 'form': form, 'queryset': page_object.page_queryset, # 分完页的数据 'page_string': page_object.html(), # 生成页码 } return render(request, 'order_list.html', context) @csrf_exempt def order_add(request): form = OrderModelForm(data=request.POST) if form.is_valid(): # 订单号 form.instance.oid = datetime.now().strftime('%Y%m%d%H%M%S') + str(random.randint(1000, 9999)) # 管理员id form.instance.admin_id = request.session['info']['id'] # 保存到数据库 form.save() return JsonResponse({'status': True}) return JsonResponse({'status': False, 'error': form.errors}) def order_delete(request): uid = request.GET.get('uid') exists = models.Order.objects.filter(id=uid).exists() if not exists: return JsonResponse({'status': False, 'error': '数据不存在'}) models.Order.objects.filter(id=uid).delete() return JsonResponse({'status': True}) def order_detail(request): ''' # 方式一 uid = request.GET.get('uid') row_object = models.Order.objects.filter(id=uid).first() if not row_object: return JsonResponse({'status': False, 'error': '数据不存在'}) # 数据库中获取数据 result = { 'status': True, 'data': { 'title': row_object.title, 'price': row_object.price, 'status': row_object.status, } } return JsonResponse(result) ''' uid = request.GET.get('uid') row_dict = models.Order.objects.filter(id=uid).values('title', 'price', 'status').first() if not row_dict: return JsonResponse({'status': False, 'error': '数据不存在'}) # 数据库中获取数据 result = { 'status': True, 'data': row_dict } return JsonResponse(result) @csrf_exempt def order_eidt(request): uid = request.GET.get('uid') row_object = models.Order.objects.filter(id=uid).first() if not row_object: return JsonResponse({'status': False, 'tips': '数据不存在'}) form = OrderModelForm(data=request.POST, instance=row_object) if form.is_valid(): form.save() return JsonResponse({'status': False}) return JsonResponse({'status': False, 'error': '数据不存在'})
文件的上传
基本
html enctype="multipart/form-data"上传文件内容
<form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="text" name="username"> <input type="file" name="avatar"> <input type="submit" value="提交"> </form>
view
from django.shortcuts import render, HttpResponse def upload_list(request): if request.method == 'GET': return render(request, 'upload_list.html') # print(request.POST) #请求体中数据 # print(request.FILES) #请求发过来的文件 file_object = request.FILES.get('avatar') f = open(file_object.name,mode='wb') for chunk in file_object.chunks(): f.write(chunk) f.close() return HttpResponse('...')
上传excel
pip install openpyxl