django 基本使用

django

下载

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django

查看版本

django-admin --version 
4.2.1

创建项目

django-admin startproject project

创建一个 app

python manage.py startapp app

注册 app

在这里插入图片描述
project/settings

# app名称.apps.app名称Config

INSTALLED_APPS = [
    ...,
    'app.apps.AppConfig',
]

编写 url

在这里插入图片描述

project/urls

from app import views

urlpatterns = [
    path('index/', views.index),
]

编写视图函数

在这里插入图片描述

app/views

from django.shortcuts import render, HttpResponse

def index(request):
    return HttpResponse('index 函数')

启动项目

python manage.py runserver

使用 templates

在这里插入图片描述
app/views.py

def user_list(request):
    return render(request, 'user_list.html')

模板继承

app/templates/layouts.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> {% block title %}  {% endblock %}</title>
</head>

<body>
    <div class="layout">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

使用继承

{% extends 'layouts.html' %}

{% block title %}
    orm
{% endblock %}
{% block content %}
    <div>ormbb</div>
{% endblock %}

使用静态文件

在这里插入图片描述

需要重新启动才会显示图片

app/static/image/xm.png

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>use_list</h1>
    <img src="{% static 'image/xm.png' %}" alt="" />
</body>
</html>

常用模板语法

在这里插入图片描述

app/views.py

def user_list(request):
    name = 'zs'
    list = ['zs', 'ls', 'xr']
    dict = {"name":"xr"}
    flag = False
    return render(request, 'user_list.html', {
        "name": name,
        "list": list,
        "dict": dict,
        "flag": flag
    })

app/templates/user_list.html

<div>
    <p>{{ list.0 }}</p>
    {% for it in list %}
        <p>{{ it }}</p>
    {% endfor %}
</div>

<div>
    {% for it in dict %}
        <p>{{ it }}</p>
    {% endfor %}
</div>

<div>
    {% if flag %}
        <p>True</p>
    {% else %}
        <p>False</p>
    {% endif %}
</div>

请求与响应

app/views.py

from django.shortcuts import render, HttpResponse, redirect

def request(request):
    # request是一个对象,封装了用户发送来的所有请求相关的数据
    # method GET
    # print('method', request.method)
    # http://127.0.0.1:8000/request/?id=1&type=2 ==> GET <QueryDict: {'id': ['1'], 'type': ['2']}>
    # print('GET', request.GET)
    # print('POST', request.POST)

    # 响应
    # return HttpResponse('request')
    # 重定向 是由浏览器重定向
    # return redirect('http://www.baidu.com')

    if request.method == 'GET':
        return render(request, 'request.html')

    #  <QueryDict: {'csrfmiddlewaretoken': ['c5F6mUAlPwCx4sr4vrBUFmgahbFKntU5jzfsILC12ssT4wtSpwsniugHlHsVr7pH'], 'name': ['ad'], 'pwd': ['12']}>
    # print('===',request.POST)
    # return HttpResponse('登录成功')

    name = request.POST.get('name')
    pwd = request.POST.get('pwd')
    if name == 'root' and pwd == '123':
        return HttpResponse('登录成功')
    return render(request, 'request.html', {'error_msg': "用户名密码错误"})

app/templates/request.html

<form action="/request/" method="post">

    {% csrf_token %}

    <input type="text" name="name" placeholder="用户名">
    <input type="password" name="pwd" placeholder="密码">
    <input type="submit" value="提交">
</form>
<p>{{ error_msg }}</p>

动态传参

 path('orm/<int:id>/edit/', views.orm),

http://127.0.0.1:8000/orm/2/edit/

def orm(request,id):
    print(id) # 2

数据库操作

下载 mysqlclient

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mysqlclient

创建数据库

create database python

Django 链接数据库

替换为 mysql 数据库
project/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'python',
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }
}

创建表和字段
app/models.py

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password  = models.CharField(max_length=64)
    age = models.IntegerField()

执行命令

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

  • 下面是 python manage.py makemigrations 生成的记录
  • 上面是 python manage.py migrate 生成的记录

更新表结构

“”"
Please select a fix:

  1. Provide a one-off default now (will be set on all existing rows with a null value for this column)
  2. Quit and manually define a default value in models.py.

新增字段时会提示:
1 让你自己输入一个值作为新增字段的默认值
2 退出 创建字段时自己加 default=‘’
“”"

python manage.py migrate 出现报错粗暴方法把所有表删除然后把这些记录都删除
最好在创建字段时就给默认值或者允许为 Null

数据库基本操作

from app.models import UserInfo

def orm(request):
    # 增
    # UserInfo.objects.create(name='zs',password='123',age=18)
    # UserInfo.objects.create(name='xr',password='123',age=28)

    # 删
    # UserInfo.objects.filter(id=1).delete()
    # UserInfo.objects.all().delete()

    # 查
    # user_list = UserInfo.objects.all()
    # user_list = UserInfo.objects.filter(id=2)
    # dict = UserInfo.objects.filter(id=2).first()

    # 改
    UserInfo.objects.filter(id=2).update(age=66)
    return HttpResponse('orm')

关联表


"""
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit and manually define a default value in models.py.

新增字段时会提示:
1 让你自己输入一个值作为新增字段的默认值
2 退出 创建字段时自己加 default=‘’
"""


class Department(models.Model):
    """ 部门 """
    title = models.CharField(verbose_name='标题', max_length=32)


class UserInfo(models.Model):
    """ 员工 """
    name = models.CharField(verbose_name='姓名', max_length=8)
    password = models.CharField(verbose_name='密码', max_length=64)
    age = models.IntegerField(verbose_name='年龄')
    # SmallIntegerField 小整形
    gender_choices = ((1, '男'), (2, '女'))
    gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
    # 账户余额十位数 两位小数 默认值为 0
    account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
    create_time = models.DateTimeField(verbose_name='入职时间')

    # 连表
    # depart 字段在 Django 中会自动加上 _id 生成为 depart_id
    # to 要关联的表名称    to_field 要关联的表的字段名
    # on_delete=models.CASCADE()  级联删除 如果部门删除那么关联员工数据也删除
    depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)

    # on_delete=models.SET_NULL() 置空 如果部门删除那么关联员工数据部门字段置空
    # depart = models.ForeignKey(to='Department', to_field='id', null=True, blank=True, on_delete=models.SET_NULL)


数据结构

+----+------+----------+-----+---------+--------+-----------+----------------------------+
| id | name | password | age | account | gender | depart_id | create_time                |
+----+------+----------+-----+---------+--------+-----------+----------------------------+
|  1 | zs   | 123      |  12 |   10.00 |      1 |         1 | 2023-05-17 00:00:00.000000 |
|  2 | zs2  | 123      |  12 |   10.00 |      1 |         1 | 2023-05-17 00:00:00.000000 |
|  3 | zs3  | 123      |  12 |   10.00 |      1 |         1 | 2023-05-17 00:00:00.000000 |
+----+------+----------+-----+---------+--------+-----------+----------------------------+

在 python 中写法

def user_list(request):
    user_list = models.UserInfo.objects.all()
    for user in user_list:
        print(
            user.depart_id, user.depart.title,
            user.create_time, user.create_time.strftime("%Y-%m-%d %H:%M:%S"),
            user.gender, user.get_gender_display()
        )
    return render(request, 'user_list.html', {"user_list": user_list})

# 1 研发 2023-05-17 00:00:00+00:00 2023-05-17 00:00:00 1 男
# 1 研发 2023-05-17 00:00:00+00:00 2023-05-17 00:00:00 1 男
# 1 研发 2023-05-17 00:00:00+00:00 2023-05-17 00:00:00 1 男

在 html 模板中写法

{% for user in user_list %}
<div>
    <span>{{ user.name }}</span>
    <span>{{ user.get_gender_display }}</span>
    <span>{{ user.create_time|date:"Y-m-d" }}</span>
</div>
{% endfor %}

zs 男 2023-05-17
zs2 男 2023-05-17
zs3 男 2023-05-17
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值