Python开发Django

1.Django安装

        pip install django==3

2.创建初始化环境并运行项目

         初始化环境中文件的作用

        启动项目

        若出现这样的错误,则可能端口被占用

3.使用pycharm终端进行app创建

        注:如果使用anaconda环境,运行之后没有显示文件夹,可能是没有进入对应的环境中

4. Django中文件查找的顺序

        优先查找TEMPLATES,然后查找INSTALL_APPS

        单独app的模板,在app中写;公共的就在最外层的templates中写html模板

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

...
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',
            ],
        },
    },
]

5. Django视图中urls的转向三种方式

from django.shortcuts import render,HttpResponse,redirect

def login(request):
    # return HttpResponse('登陆页面') #返回对应响应
    # return render(request,'login.html') #返回对应的跳转页面
    return redirect('https://www.baidu.com') #返回重定向界面

6. Django模板中的动态url设计

        使用参数化的话可以动态传入url的参数,实现参数化

        注:html中的列表或者字典的取值方式是通过 .元素 来取值的

7.静态资源

        可以将静态资源保存在app文件的static目录下(需要新创建),有多个app时,需要注意寻找顺序

        static的引入

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>你的名字</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<div>宫水三叶</div>
<img src="{% static 'images/img.png' %}" style="width: 50px;height: 60px">
<a href="" class="btn btn-danger">删除</a>
</body>
</html>

8.小案例

        输入账号密码并提交跳转到对应主页,否则提示账号密码错误

def name(request):
    if request.method == 'GET':
        return render(request,'name.html')
    user = request.POST.get('username')
    pwd = request.POST.get('password')
    if user=='123' and pwd=='123':
        return redirect('https://baike.baidu.com/item/%E5%AE%AB%E6%B0%B4%E4%B8%89%E5%8F%B6/20095281?fr=ge_ala')
    else:
        return render(request,'name.html',{'error':'账号密码错误'})
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>你的名字</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<div>宫水三叶</div>
<img src="{% static 'images/img.png' %}" style="width: 50px;height: 60px">
<a href="" class="btn btn-danger">删除</a>
<form action="/name/" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="输入用户名">
    <input type="password" name="password" placeholder="输入密码">
    <input type="submit" value="提交">
    <span style="color: red">{{ error }}</span>
</form>
</body>
</html>

9.django中的数据库使用

        在web中的models.py文件中 编写数据库存储类型格式

        依次执行以下两行代码

#删除表时可用
python manage.py makemigrations
#添加表时可用
python manage.py migrate

10.sqlite的使用方式

        增删改查

def database(request):
    from web import models
    #数据增加
    models.UserInfo.objects.create(username='宫水三叶',password='123',age=18)
    models.UserInfo.objects.create(username='宫水四叶',password='123',age=6)
    models.UserInfo.objects.create(username='滝',password='123',age=15)
    models.UserInfo.objects.create(username='滝',password='123',age=15)
    #数据删除
    models.UserInfo.objects.filter(id=4).delete()
    #数据修改
    models.UserInfo.objects.filter(id=3).update(age=16)
    #数据查询
    #filter充当过滤器类似于sql中的where
    info = models.UserInfo.objects.all()
    for obj in info:
        print(obj.id,obj.username,obj.age)

    return HttpResponse('相应成功')

11.session和cookie的绑定

        使用django自带的进行session的创建和校验

12.使用中间件优化

        为了方便cookie和session的鉴权,我们使用中间插件去管理

        应用场景:1.日志,获取访问时,请求的IP地址并记录到文件中。2.权限校验,有权限的返回None,无权限就返回HttpResponse(‘无权访问’)。3.登陆判断,判断用户的session中是否存储信息。

13.html中的母版继承

        使用母版可以加载每个页面的公共部分节省了代码的冗余。

        母版格式

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>你的名字</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap3/css/bootstrap.css' %}">
    {% block css %}{% endblock %}
</head>
<body>
<div class="navbar navbar-default" style="border-radius: 0">
  <div class="container-fluid container">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="https://baike.baidu.com/item/%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97%E3%80%82/19127928?fr=ge_ala">你的名字</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="/depart/list/">部门 <span class="sr-only">(current)</span></a></li>
        <li><a href="/assert/list/">资产</a></li>
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">Separated link</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
      </ul>
{#      <form class="navbar-form navbar-left">#}
{#        <div class="form-group">#}
{#          <input type="text" class="form-control" placeholder="Search">#}
{#        </div>#}
{#        <button type="submit" class="btn btn-default">Submit</button>#}
{#      </form>#}
      <ul class="nav navbar-nav navbar-right">
        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ username }} <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li role="separator" class="divider"></li>
            <li><a href="/logout/">注销</a></li>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</div>

<div class="bs-example container" data-example-id="bordered-table">
    {% block content %}{% endblock %}
</div>

<script src="{% static 'js/jquery.js' %}"></script>
<script src="{% static 'plugins/bootstrap3/js/bootstrap.js' %}"></script>
{% block js %}{% endblock %}
</body>
</html>

        样式版继承

{% extends 'layout.html' %}

{% block content %}
    <div style="margin-bottom: 5px">
        <a class="btn btn-success">添 加</a>
    </div>
    <table class="table table-bordered">
      <thead>
        <tr>
          <th>id</th>
          <th>名字</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody>
      {% for obj in infos %}
        <tr>
          <td>{{ obj.id }}</td>
          <td>{{ obj.title }}</td>
          <td>
              <a class="btn btn-primary btn-xs">编辑</a>
              <a class="btn btn-danger btn-xs">删除</a>
          </td>
        </tr>
      {% endfor %}
      </tbody>
    </table>
{% endblock %}

14.ModelForm组件

        自动生成html标签+自动读取关联数据

        表单验证+错误提示+保留之前提交的数据

        数据库进行:新建、修改

        如果要想精确定义返回值的类型,需要将在models文件中进行修改

15. 批量处理标签样式

16. 添加标签之后自动调用表中的列名

17. 通过form快速保存信息

18.表中数据增删改时的规则判断

        如果sqlite中的数据在处理时需要进行判定,则可以在clean_函数中实现

19. 数据库使用范围查询的形式

20. ORM操作

        对象关系映射,主要用于跨表查询

21. 页面分页标签的封装

import copy
from django.utils.safestring import mark_safe
class Pagination(object):
    def __init__(self,request,total_count):
        page = request.GET.get('page','1')
        if not page.isdecimal():
            page = 1
        else:
            page = int(page)
            if page<1:
                page = 1
        self.page = page
        self.start = (page-1)*10
        self.end = page*10
        self.total_count = total_count
        total_page,div = divmod(self.total_count,10)
        if div:
            total_page += 1
        self.total_page = total_page

        self.quert_dict = copy.deepcopy(request.GET)
        self.quert_dict._mutable=True


    def html(self):
        page_list = []
        if self.total_page<=11:
            page_start = 1
            page_end = self.total_page+1
        else:
            if self.page<=5:
                page_start = 1
                page_end = 11+1
            else:
                if self.page+5>self.total_page:
                    page_start = self.total_page-9
                    page_end = self.total_page+1
                else:
                    page_start = self.page-5
                    page_end = self.page+5
        for i in range(page_start,page_end+1):
            self.quert_dict.setlist('page',[i])
            query = self.quert_dict.urlencode()
            if i == self.page:
                element = '<li class="active"><a href="?{}">{}</a><li>'.format(query, i)
            else:
                element = '<li><a href="?{}">{}</a><li>'.format(query, i)
            page_list.append(element)
        page_string = mark_safe(''.join(page_list))
        return page_string

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值