django 01

安装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">&times;</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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值