Django_1

目录

1. 安装与启动

2. 默认文件介绍

3. APP

4. 快速上手

5. 模板和静态文件

5.1 templates模板

5.2 静态文件

6. 模板语法

7. 请求和响应

 7.1 案例:用户登录

8. Djongo操作MongoDB(×)

8.1 连接

8.2 创建collections 

8.3 操作数据库 

8.4 案例--用户列表

8.4.1 展示用户列表

 8.4.2 添加用户

8.4.3 删除用户


1. 安装与启动

Django安装_grfstc的博客-CSDN博客

django-admin startproject mysite --创建名为“mysite”的项目

cd mysite --进入该项目目录下

python manage.py runserver --启动服务 

2. 默认文件介绍

manage.py】项目的管理:启动项目、创建app、数据库管理等。不需修改。 常使用

asgi.py】【wsgi.py】接收网络请求。不需修改。

setting.py】项目配置:连接数据库等。常操作

urls.py】url与函数的对应关系。常操作

3. APP

在终端Terminal按以下输入,创建名为“app01”的app。

python manage.py  startapp app

 

migrations】数据库变更记录。

admin.py】django默认提供了admin后台管理。

apps.py】app启动。

models.py】对数据库操作。常操作

tests.py】用于单元测试。

views.py】 定义视图函数。定义【urls.py】的函数。常操作

4. 快速上手

1. 确保app注册:setting.py中INSTALLED_APPS中加入"app01.apps.App01Config"

2. 编写url和视图函数对应关系【url.py】

 

3. 编写视图函数【views.py】 

 

 

5. 模板和静态文件

5.1 templates模板

1. 创建html: app01下创建templates文件夹,在templates下创建.html。

2.url.py编写url与函数对应关系

3.views.py

# views.py
def user_list(request):
    return render(request, "user_list.html")

注:.html根据app的注册顺序,在app目录下寻找到templates,再寻找.html。

5.2 静态文件

图片、JS、CSS、插件。

在app目录下创建static,static下创建css、img、js、plugins。

 引入静态文件,置顶写入{% load static %} 路径{% static '静态文件路径' %}。

{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-5.0.1/bootstrap.min.css'%}">
</head>
<body>
    <input type="text" class="btn btn-primary" value="新建">
    <img src="{% static 'img/background.webp' %}" alt="">
    <script src="{% static 'plugins/bootstrap-5.0.1/bootstrap.bundle.min.js'%}"></script>
</body>
</html>

6. 模板语法

# views.py

def tpl(request):
    name = "GWJ"
    roles = ['管理员', '保安']
    user_info = {'name':'GWJ', 'age':22, 'role':'stu'}
    data_list=[
        {'name':'GWJ', 'age':22, 'role':'stu'},
        {'name':'LJW', 'age':22, 'role':'stu'},
        {'name':'GGG', 'age':22, 'role':'stu'}
    ]
    return render(request, "tpl.html", {"n1": name, "n2": roles, "n3": user_info, "n4": data_list})
<!-- tpl.html -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-5.3.0/css/bootstrap.css'%}">
</head>
<body>
    <h3>模板语法学习</h3>
    <div>{{ n1 }}</div>
    
    <!-- 列表使用0 1 2下标查询 -->
    <div>{{ n2 }}</div>
    <div>{{ n2.0 }}</div>
    <div>{{ n2.1 }}</div>
    <div>
    <!-- 列表循环查询 -->
        {% for item in n2 %}
            <span>{{ item }}</span>
        {% endfor %}
    </div>

    <!-- 字典使用key查询 -->
    <div>{{ n3 }}</div>
    <div>{{ n3.name }}</div>
    <div>{{ n3.age }}</div>
    <!-- 字典循环查询 -->
    <ul>
        {% for k,v in n3.items %}
            <li>{{ k }} = {{ v }}</li>
        {% endfor %}
    </ul>

    <div>{{ n4 }}</div>
    <div>{{ n4.1 }}</div>
    <div>{{ n4.1.name }}</div>
    {% for item in n4 %}
        <div>{{ item.name }}</div>
    {% endfor %}
    
    <!-- 条件语句 -->
    {% if n1 == "GWJ" %}
        <h1>啦啦啦</h1>
    {% else %}
        <h1>哈哈哈</h1>
    {% endif %}

    <script src="{% static 'js/query-3.6.3.min.js' %}"></script>
    <script src="{% static 'plugins/bootstrap-5.3.0/js/bootstrap.js' %}"></script>
</body>
</html>

结构过程:

例如,此页面中得到的是渲染后的html,而不是有{}的html文件。

7. 请求和响应

# views.py

def reqst(request):
    # requst是一个对象,封装了用户发过来的所有数据。

    # 1.获取请求方式 GET/POST
    print(request.method)

    # 2.在URL传递一些值 ?name="GWJ"&&age=12
    print(request.GET)

    # 3.在请求体中提交数据
    print(request.POST)

    # 4.【响应】HttpResponse("返回内容"),字符串内容返回给用户。
    # return HttpResponse("成功!")

    # 5.【响应】读取HTML+渲染 -> 字符串,返回给用户浏览器。
    # return render(request, "reqst.html")

    # 6.【响应】让浏览器重定向到其他页面。
    return redirect("https://www.baidu.com")

注:重定向是浏览器向网站请求,返回后,请求者再向百度请求

 7.1 案例:用户登录

问题:Forbidden

 解决:在form表单中加{% csrf_token %}

# views.py
def login(requst):
    if requst.method == "GET":
        # 以get方式提交
        return render(requst, "login.html")
    else:
        # 以post方式提交时,获取数据
        print(requst.POST)
        username = requst.POST.get("user")
        password = requst.POST.get("pwd")
        if username == "admin" and password == "123":
            # return HttpResponse("登陆成功!")
            return redirect("https://www.baidu.com")
        else:
            return render(requst, "login.html", {"error_msg":"用户名或密码错误"})
<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>用户登录</h3>
<form method="post" action="/login/">
    {% 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>
</form>
</body>
</html>

8. Djongo操作MongoDB(×)

环境pymongo == 3.12.1,djongo == 1.3.4。

8.1 连接

# setting.py
DATABASES = {
    "default": {
        "ENGINE": "djongo",
        "ENFORCE_SCHEMA": True,
        "NAME": "demo0",
        "HOST": "127.0.0.1",
        "PORT": 27017
    }
}

8.2 创建collections 

# models.py
# 添加model,类-->collection
from djongo import models
class mycol(models.Model):
    name = models.CharField(max_length=16)
    password = models.CharField(max_length=32)
    age = models.IntegerField(default=0)

 models.py改变,在终端需要迁移:

python manage.py makemigrations
python manage.py migrate

mongodb生成"_id",类型为ObjectId。

使用Djongo自动生成"id"列,类型为integer。

 

8.3 操作数据库 

# urls.py
urlpatterns = [
    # 添加对应关系
    path("mon/login/", views.mon_login),
]
# views.py
from .models import mycol
from django.db.models import Q
def mon_login(request):

    # 创建documents
    mycol.objects.create(name='GWJ', password='', age=22, email="488378705@qq.com")
    mycol.objects.create(name='LJW', password='', age=22, email="LJW@qq.com")
    mycol.objects.create(name='XTT', password='', age=22, email="XTT@qq.com")

    # 删除documents
    mycol.objects.filter(name='GWJ').delete()  # 删除符合条件的
    mycol.objects.all().delete()  # 删除全部

    # 查询documents
    # mycol.objects.all()获取到的是QuerySet类型
    # 查询所有
    queryset = mycol.objects.all()  # 得到的是对象列表queryset = [<mycol: mycol object>, <mycol: mycol object>]
    # 遍历输出
    for obj in queryset:
        print(obj.name, obj.password, obj.age, obj.email)
    queryset = mycol.objects.filter(name='LJW') 得到符合条件的对象列表
    # 查询第一条数据
    obj = mycol.objects.first() # 得到一个对象<mycol: mycol object>
    # 查询筛选后的第一条数据
    obj = mycol.objects.filter(name='LJW').first() #得到符合条件的一个对象
    queryset = mycol.objects.filter(age__gt=22)  # 年龄 > 22
    queryset = mycol.objects.filter(name__startswith='X').first()  # 字符串以L起始
    queryset = mycol.objects.filter(Q(age__gte=9) & Q(age__lte=12))  # 查询年龄在9~12之间(含)的

    # 更新documents
    mycol.objects.filter(name='LJW').upadte(password="753")

    return HttpResponse("添加成功!")

8.4 案例--用户列表

8.4.1 展示用户列表

- 获取所有用户信息

- HTML渲染

# urls.py
path("info/list/", views.info_list),
# views.py
def info_list(request):
    # 1.获取数据
    queryset = mycol.objects.all()
    # 2.传递数据
    return render(request, "info_list.html", {"data_list": queryset})
<!-- info_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>用户列表</h2>
<table border="1">
    <thead>
        <tr>
            <th>name</th>
            <th>password</th>
            <th>age</th>
            <th>email</th>
        </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
            <td>{{ obj.email }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

 8.4.2 添加用户

- GET,看到页面,输入内容

- POST,提交数据-->写入数据库

# urls.py
path("info/add/", views.info_add),
# views.py
def info_add(request):
    if request.method == "GET":
        return render(request, "info_add.html")

    # 获取用户提交的数据
    name = request.POST.get("name")
    pwd = request.POST.get("pwd")
    age = request.POST.get("age")
    email = request.POST.get("email")
    # 添加到数据库
    mycol.objects.create(name=name, password=pwd, age=age, email=email)
    return redirect("/info/list/")
# info_add.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>添加用户</h2>
<form action="/info/add/" method="post">
    {% csrf_token %}
    <input type="text" name="name" placeholder="请输入用户名">
    <input type="text" name="pwd" placeholder="请输入密码">
    <input type="text" name="age" placeholder="请输入年龄">
    <input type="text" name="email" placeholder="请输入邮箱">
    <input type="submit" value="提交">
</form>
</body>
</html>

8.4.3 删除用户

根据id(主键)删除。

# urls.py
path("info/delete/", views.info_delete),
# views.py
from bson.objectid import ObjectId
def info_delete(request):
    nid = request.GET.get('nid')
    mycol.objects.filter(id=ObjectId(nid)).delete() # 关键代码
    return redirect("/info/list/")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值