Django 第一步

时间:2021-6-4 作者:qvyue

1. 配置 settings

静态文件相关:

STATIC_URL = '/static/' 

静态文件的别名,可以修改,默认是 /static/ 使用的时候直接写 /static/就可以,不要写文件夹的名字。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
] 

静态文件存放的目录,这个是自己配置的,可以提供多个地址,使用的时候全都可以用别名访问到。

TEMPLATES 相关:

        'DIRS': [
            os.path.join(BASE_DIR, "templates")
        ],

需要加一个 DIRS 配置一下全局模板路径。

新的 App 的注册

INSTALLED_APPS = [
    "App.apps.AppConfig",
    'App',
]

第一种方法是配置到 App 的 AppConfig 类上,这是推荐写法,这种方法可以让 Django 帮我们做一些额外的操作,第二种就是直接写上 App 的名字。

中间件相关

MIDDLEWARE = [
    # 'django.middleware.csrf.CsrfViewMiddleware',
]

暂时注册掉 csrf 相关的中间件,可以让我们方便地提交 POST 请求。

2. url.py 路径和函数的对应关系

from App import views
urlpatterns = [
    path("login/", views.login)
]

列表里写 views 的函数,但是不要写括号(写函数名),注意要导入相应 App 的 views。

3. view.py 写处理函数

from django.http import HttpResponse
from django.shortcuts import render, redirect
def hello(request):
    return HttpResponse("返回的字符串")
    return render(request, "模板名.html")
    return redirect("路由")

目前了解了三种返回的情况,第一种是返回一个字符穿,也可以是 html 标签;第二种是返回模板文件,第一个参数是 request 对象;第三种是返回重定向,需要写完整 url 地址,或者自己写的路由。

在写业务逻辑的时候有一些东西会用得上:

request.method

if request.method == "POST":
    pass

获取请求方式,字符串

request.POST 和 request.GET

# 处理 POST 请求
# 获取用户名和密码
user = request.POST.get('inputEmail')
pwd = request.POST.get('inputPassword')

获取 POST请求数据提交的数据是,一个字典。可以通过正常的字典方法获取数据,但是在找不到 key 的时候会包错所以专门包装了一个 request.POST.get() 来获取值。

request.GET 来获取 url 上的查询参数,也是一个字典。

ps POST 和 GET 的区别

  • GET 获取一个资源,在地址栏中输入地址回车就可以发 Get 请求
  • POST 提交数据不会显示在 url 中,发 POST 请求 可以使用 form 表单。

form 表单需要注意的点

  1. form 标签的属性 action :指定提交的地址(不写默认是当前地址);method :请求方式(默认get)
  2. input 标签要有 name 属性,有的标签还需要有 value
  3. 有一个 button 按钮或者是 typy = “submit” 的 input
  4. 可以在 form 表单加一个 novalidate 取消前端校验

4. ORM

ORM 对象关系映射,通过操作面向对象的方式操作数据库。
优点是可以更好的让开发人员关注逻辑,提高开发的效率,但是会降低运行的效率,另外有一些复杂的 SQL 语句没有实现,还是需要自己实现。

对应关系:

面向对象 数据库
对象 数据行(记录)
属性 字段

给数据库修改表结构:

  1. 在 app 下的 models 中写类并继承 Model
from django.db import models
class User(models.Model):
    userName = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
  1. 执行数据库迁移命令
python manage.py makemigrations
python manage.py migrate

首先创建迁移文件(检测并记录 models 文件有什么变化),然后迁移,将变更迁移到数据库中。

执行 makemigrations 会创建一个 migrations 文件,如果执行 makemigrations 之后想要重新修改,只需删除最新的 migrations 文件,然后修改 models 文件,重新执行 makemigrations 命令。

简单的 orm 语法

def orm(request):
    ## orm 的测试
    from App import models
    ret = models.User.objects.all() # 获取表中所有数据 QuerySet 对象列表
    for i in ret:
        print(i, i.userName, i.password, type(i.userName))

    # 获取数据列表中的数据
    ret = models.User.objects.get(userName = "123", password = "123")
    # 获取一条数据,获取不到或者获取到多条数据的时候就会包错

    ret = models.User.objects.filter(userName="123", password="123")
    # 获取满足条件的多条数据

    if models.User.objects.filter(userName="123", password="123"):
        return redirect('/index/')
    return render(request, "hello.html")

查询:

models.Publisher.objects.all().order_by('-id')  

查询所有数据,根据 id 倒序排序,获取的是数据列表

models.Publisher.objects.get(name='???', pk=1)

查询一个数据,name是 ???,主键是 1。获取的是一个对象。注意没有查询到或者不是唯一会报错。

models.Publisher.objects.filter(name='???')

查询多个数据,QuerySet 对象列表。

下面是一个实例

def publisher_list(request):
    # 返回一个页面并且展示所有出版社信息
    # 获取所有的出版社信息
    all_publishers = models.Publisher.objects.all().order_by('-id')  # 获取的是数据列表
    # for i in all_publishers:
        # print(i)
        # print(i.name)
        # print(i.id)
    # 返回页面
    return render(request, "publisher_list.html", {'all_publishers':all_publishers})

新增

models.Publisher.objects.create(name='???')

在数据库中新增一个 Publisher 对象,名字是 ???,并返回该对象。

def publisher_add(request):
    # post 请求
    # 获取用户提交的数据
    # 将数据新增到数据库中
    # 返回一个重定向到展示出版社的页面
    if request.method == "POST":
        pub_name = request.POST.get('pub_name')
        # print(pub_name)
        # 判断是否是重复值
        if models.Publisher.objects.filter(name=pub_name):
            return render(request, "publisher_add.html", {"error":"出版社名称已经存在"})

        # 判断是否是空值
        if not pub_name:
            return render(request, "publisher_add.html", {"error":"输入不能为空!"})

        ret = models.Publisher.objects.create(name=pub_name)
        # print(ret, type(ret))
        return redirect("/publisher_list/")

    return render(request, "publisher_add.html")

删除

models.Publisher.objects.get(pk=???).delete()
models.Publisher.objects.filter(pk=???).delete()

通过单个对象删除和多个对象批量删除。

def publisher_del(request):
    # 获取要删除数据的 id
    # 根据 id 到数据库进行删除
    # 返回重定向到展示新页面

    pk = request.GET.get("pk")

    models.Publisher.objects.get(pk=pk).delete() # 查询到一个对象列表,删除该对象

    return redirect("/publisher_list/")

修改

pub_name = request.POST.get('pub_name')
pub_obj.name = pub_name  # 只是在内存中修改了
pub_obj.save() # 在数据库中修改

首先在内存中修改,然后再数据库中修改。

下面是一个实例,注意在修改的时候要判断一下是 post 请求还是一个 get 请求。

def publisher_change(request):
    # get
    # 获取到要修改的数据的 id
    # 根据返回的 id 到新的页面进行修改

    # post
    # 根据 id 修改数据库中的数据
    pk = request.GET.get("pk")
    pub_obj = models.Publisher.objects.get(pk=pk)

    if request.method=="GET":
        return render(request, "publisher_change.html", {"pub_obj":pub_obj})
    else:
        pub_name = request.POST.get('pub_name')
        pub_obj.name = pub_name  # 只是在内存中修改了
        pub_obj.save() # 在数据库中修改

        return redirect('/publisher_list/')

5. 模板语法

{{ k1 }}

{% for i in all_publishers %}

    {{ forloop.counter }}
    {{ i.name }}
    {{ i.pk }}
    {{ i.id }}

{% endfor %}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。