美文网首页
Django 第一步

Django 第一步

作者: Vector_Wan | 来源:发表于2021-03-12 22:22 被阅读0次

    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 %}
    

    相关文章

      网友评论

          本文标题:Django 第一步

          本文链接:https://www.haomeiwen.com/subject/udxtcltx.html