自学Django之路---Day1.初识

9 篇文章 0 订阅
6 篇文章 0 订阅

准备工作

创建django项目

可以先创建一个虚拟环境(当然,也可以不创建),之后使用如下命令
来创建一个Django项目:

  • django-admin startproject 项目名

使用pycharm导入项目

如果我们为项目起的名字是HelloDjango,那么选中这个文件夹导入,接着进入设置,选择对应的(如果创建了虚拟环境,那么就选择虚拟环境的python解释器)解释器。

开始

可以使用如下命令来测试运行结果。

  • python manage.py runserver

使用如下命令来创建一个App:

  • python manage.py startapp 名字

HelloDjango文件夹下现在应该有如下内容:

  • App文件夹(名字是你起的)
  • HelloDjango文件夹
  • manage.py
  • db.sqlite3

子HelloDjango文件夹下的:

  • settings.py是配置文件

  • urls.py是路由,即不同的页面,可以在这里添加path来编写多个页面。
    第一个参数是页面名称,第二个参数是页面的位置,在App的views.py中,
    在此文件中定义方法来使得在urls.py中新添加的页面有效,这个新的方法
    第一个参数必须是request(当然,参数名随意),也必须返回response对象
    可以用简单的 HttpResponse(‘2020/6/26’) 来测试一下(当然,这需要我们导入from django.http import HttpResponse头文件)。

    也可以不使用HttpResponse,而是导入一个模板作为返回对象,见下

  • wsgi.py好像是发布时用的,以后学到再说。

使用模板的两种方式

  • 在App中新建一个文件夹:template,
  • 在template中创建html文件
  • 依然是在urls中添加新的path,第二个参数写views.名字
  • 在views中定义那个方法,只不过现在返回的是render(request, ‘index.html’),render可以将html文件渲染好返回给urls
  • 为了让在views返回templates文件时有提示,需要做如下两件事:
    1. 将templates文件夹右键标记目录为template
    2. 在settings.py中INSTALLED_APPS这一项中添加’App’
  • 不在App而是在项目目录,即第一个HelloDjango下创建templates的文件夹(右键标记为template)
  • 和第一种方法一样,在urls中添加path,然后在views中写相应方法
  • 在settings.py中TEMPLATES下’DIRS’里添加: os.path.join(BASE_DIR, ‘templates’),才行,将这个模板注册进去

!注意! 这里templates一定不要写错,我当时就是没加s导致里面的html文件怎么都加载不出来。

使用多个App

我们之前都是在子HelloDjango文件夹下urls里添加的路由,但是当路由多了的时候很麻烦,因此我们可以用下面的方式:

步骤

  • 在最外层HelloDjango下创建一个新的App,例如Two (python manage.py startapp Two)
  • 在Two里面新建一个文件:urls.py
  • 文件内容是:urlpatterns = [],在列表里写和之前的urls中相同形式的内容,如:path(‘home/’, views.home),当然,包还是要导入的
  • 在Two的views中创建相应的方法并导入包
  • 但此时主urls并不知道Two中也有urls,因此在其中添加path(‘Two/’, include((‘Two.urls’, ‘Two’))),
  • 别忘了在settings中添加’Two’,
  • 访问时,看看我们在主urls是怎么写的,我这里是Two,因此要用127.0.0.1:8000/Two/home来访问Two的urls中的home

访问大致流程

访问流程
今天主要是了解了大致的模块,并简单熟悉了一下流程。通常来说,views是要访问数据库来拿到数据的,但上面并没有经过DB,只是简单的试验了一下。

与数据库连接

在models中与数据库进行对接,默认使用的是db.sqlite3 models使用ORM技术(Object Relational Mapping, 对象关系映射),这样我们在对数据进行处理时就不用再写之前的insert、select等等,而是直接object.save()、object.delete()就行。
关系型数据库首先要定义数据库(DDL),在Django中,通过models的定义实现数据库表的定义。

创建表

在这个过程中,遇见了如下问题:
将db.sqlite3导入到pycharm自带的数据库时,下面有条红色的波浪线并且数据库也点不开,
后来得知在导入数据时,在界面的左下角有一个download missing 什么玩意,点一下就行了。

  1. 在models中创建类,然后使用python manage.py makemigrations
  2. 再输入python manage.py migrate来将你写的类变成表

**注意,makemigrations用来生成迁移文件,可以在migrations文件夹中看到,如果以后想用其他数据库(如mysql),那么就不用执行这句了(因为迁移文件已经生成),直接执行第二句就行了。

类的内容:
class Student(models.Model):
    name = models.CharField(max_length=16)
    age = models.IntegerField(default=1)

在完成上述步骤后,即可在pycharm中查看数据库并可以对其进行操作。
可以双击表进入弹出的页面来添加/删除数据,但也可以用代码的方法

用代码操作表

添加数据

在urls中添加一条:

  • path(‘addstudent/’, views.addstudent),

然后在views中写这个方法:

  def addstudent(request):
    student = Student()
    # student.age = 17
    student.name = 'Peter'
    student.save()

    return HttpResponse('Add Success!')

这时在进入浏览器并输入127.0.0.1:8000/books/addstudent时就会提示添加成功了。
在数据库中也可以看到记录。

遇见的问题:
输入上述地址时,报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence

解决方法如下:

找到django/views下debug.py
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open() as fh
将其改成:
with Path(CURRENT_DIR, 'templates', 'technical_500.html').open(encoding="utf-8") as fh

输出数据

先介绍一个新东西,在html中也可以用for、if等语句。
html中有形似{{ data }}的结构就说明这是一个“坑”,我们待会要填它。
在哪里填呢?由于我们使用了html文件响应,那么自然要在render()
中填,render的第三个参数是一个字典,里面的key就是上面的data,
那么当程序运行时,会从这个字典中找到data对应的value放到html中。

现在想在浏览器上打印所有学生的信息,怎么办?

  • 很显然我们先要在urls中添加path:path(‘get_student/’, views.get_student),并在views中写入对应的方法
  • 使用Student.objects.all()返回一个列表,里面存的是所有对象:
def get_student(request):
    students = Student.objects.all()
    context = {
        'students': students
    }

    return render(request, 'info.html', context=context)

html文件如下:

<ul>
    {% for student in students %}
            <li>{{ student.name }}</li>
    {% endfor %}
</ul>

这里的students作为字典的key,而value则是students(和key同名而已),
在html中,students会被替换成所有学生对象的列表。

现在可以看见所有学生的信息了。

对数据的其他操作

有了上面的知识,更新、删除数据都变得容易了,更新的操作如下:

  • 老套路,在urls增加path item,在views中写方法
  • 这次用Student.objects.get(pk=2)来得到某个学生对象,这个方法参数是筛选条件。
  • 查到对象后,对其属性进行更改,然后save:
def update_student(request):
    student = Student.objects.get(pk=2)
    student.age = 30
    student.save()
    return HttpResponse('update success!')

删除同理,不同之处只是:student.delete()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值