Django入门

这篇文章是作者根据《Python核心编程》中的Django相关内容,结合自己实际使用经验,记录自己初学时的步骤。

一、环境

  1. Windows 7
  2. Python 3.6
  3. Django 1.8.17
  4. Pycharm 2016.2.3/IDEA 2016.3.3 + python插件

二、安装环境

Python:https://www.python.org/
Pycharm:http://www.jetbrains.com/pycharm/ Pycharm社区版是免费的,但没有集成Django相关的功能
Django:https://www.djangoproject.com/
作为学习用的话就尽量下载最新版,如果作为实际开发用的话就下载稳定版

三、部署

1.新建一个工程
在这里插入图片描述

  • 勾选Enable Django admin,方便以后直接通过web方式管理数据库
  • 输入Application name,这样IDEA会自动帮我们创建一个应用。如果这里忘记填写,之后还可以在项目目录运行cmd命令:manage.py startapp [appname]来创建一个应用

在这里插入图片描述

  • 数据库类型选用sqlite,可以根据需要自行选择

整个项目目录结构如下:
在这里插入图片描述
项目:
settings.py:整个项目的相关配置
urls.py:全局的URL配置
应用:
model.py:实体类在这个地方进行声明,MTV中的M
views.py:业务逻辑写在这个地方,MTV中的V(类似MVC中的C)
templates:模板文件夹,MTV中的T(MVC中的V)
对于初学者来说,修改添加的地方大多是这些文件(夹)
django_demo这里可以对运行相关配置进行修改
最后点击右上角的运行按钮即可(默认是8000端口,可以自行修改)

tip:如果说电脑安装了多个版本的python,记得将安装了django的python文件夹设置在系统的环境变量中,或者自行在项目目录下打开cmd运行命令(管理员权限):
在这里插入图片描述

网址输入127.0.0.1:8000就可以看到初始界面了

四、MTV–Model(模型)

web服务往往都会使用到数据库的服务,而我们在使用Django框架中需要完成下面几项即可。

  1. 创建数据模型
  2. 配置数据库
  3. 创建表
    之后对于数据库的操作我们都可以通过admin页面来完成

4.1 创建数据模型

Django中会根据你在应用的models.py里面定义的类来自动建立数据库的表,我们只需要在里面定义好我们的数据模型就好。
例如我们要对51job上的岗位信息进行存储,需要保存的字段有:职位名、公司名、工作地点、薪资。
需要修改两个地方的文件 models.pyadmin.py

# models.py
from django.db import models
# -*- coding: utf-8 -*-
def decode(info):#防止添加中文字符出错
    return info.decode('utf-8')
# Create your models here.
class Job(models.Model):#django会自动对没有AutoField的表建立一个id字段当做逻辑主键
    jobName = models.CharField(max_length=100)# 职位名
    companyName = models.CharField(max_length=100) #公司名
    workPlace = models.CharField(max_length=20) # 工作地点
    minSalary = models.IntegerField(default=0) # 薪资最小值
    maxSalary = models.IntegerField(default=0) # 薪资最大值
# admin.py
from django.contrib import admin
from JobCrawler import models
# Register your models here.
admin.site.register(models.Job)

字段对应类型可以参考 https://www.cnblogs.com/maociping/p/5255834.html ,某些不确定或没有的类型可以自行查看源码(可能由于版本原因导致)

4.2 配置数据库

为了方便起见,之前在项目创建时选用了sqlite,选定了之后IDEA/Pycharm会自动配置好

# settings.py
# 更多数据库配置:https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

4.3 创建表

在项目路径下用管理员权限运行cmd,运行以下命令:
Django1.9-:

python manage.py syncdb

Django 1.9+

python manage.py migrate 
python manage.py makemigrations

之后需要你创建一个新的管理员用户

python manage.py createsuperuser

按照提示弄就好
使用刚刚创建好账户就可以访问 http://127.0.0.1:8000/admin/

五、MTV–View(视图)

Django的views.py中主要是写后台逻辑,为了验证在视图中能否对数据库进行操作,我们先手动在admin中往数据库添加记录。
在这里插入图片描述

5.1 创建视图函数

先测试输出Hello World: http://127.0.0.1:8000/job/
views.py 中我们先定义一个函数,用以输出文字Hello World

# views.py
from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.
def job(request):
    return HttpResponse("Hello World");

之后我们在 urls.py 里定义好url和处理函数的对应关系

# urls.py
from django.contrib import admin
from django.urls import path
from JobCrawler import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('job/', views.job),#第一个参数是浏览器路径,第二个参数是views.py中对应的函数名
]

关于urlpatterns,还有2种书写方式
(具体描述链接:https://docs.djangoproject.com/en/dev/topics/http/urls/)

Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))

访问 http://127.0.0.1:8000/job/ 就可以了

5.2 访问数据库

接下来加点内容,希望能够通过get请求获取想要的数据库信息。
例如:通过浏览器访问 http://127.0.0.1:8000/job/?queryStr=alibaba 查询第一条公司名为alibaba的工作的相关信息

from django.shortcuts import render
from django.shortcuts import HttpResponse
from JobCrawler.models import Job

def job(request):
        if(request.method == "GET"):#处理GET方法
            if(request.GET.get("queryStr") == None):
                return HttpResponse("Query string is none!")
            else:
                job = Job.objects.filter(companyName=request.GET.get("queryStr"))
                if len(job) == 0:
                    return  HttpResponse("Query Result is empty")
                else:
                    result = job.all()[0]
                    return HttpResponse("id:"+str(result.id) +"<br>minSalary:" + str(result.minSalary)+"<br>maxSalary:" + str(result.maxSalary)+"<br>workPlace:" + result.workPlace+"<br>jobName:" + result.jobName)
        return HttpResponse("Do Nothing")

ok,访问 http://127.0.0.1:8000/job/?queryStr=alibaba
在这里插入图片描述
关于Django剩余的数据库CRUD操作基本类似,可以参考下面链接:
http://www.runoob.com/django/django-model.html

六、MTV–Template(模板)

这部分主要讲解的是Django对静态文件(CSS、JS之类)的引用以及动态数据的添加,需要补HTML(5)的知识可以参考下面链接:
http://www.runoob.com/html/html5-intro.html
在这个项目中,我们添加两个HTML文件:query.html和result.html,用于查询和展示数据库的相关信息

6.1 静态文件的引用

  1. 在项目目录下创建 assets 文件夹
    在这里插入图片描述
  2. setting.py 中配置STATICFILE_DIR信息
# setting.py
STATIC_URL = '/static/' #template中调用静态资源的起始URL
STATICFILES_DIRS=(#注意名字,不要写错
   os.path.join(BASE_DIR,'assets')#指定静态文件资源在 BASE_DIR/assets下找
)
  1. 在templates/query.html中调用静态文件资源
    为了测试jquery是否引入成功,使用js代码修改input[type=‘submit’]的值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>TestQuery</title>
</head>
<script src="/static/js/jquery-1.10.2.min.js"></script>
<script>
    $(document).ready(function(){
        $("#submit").val("提交");
    });
</script>
<body>
<form action="/job/" method="get">{% csrf_token %}
    <div><label>companyName:</label><input name="queryStr" type="text"></div>
    <div><input type="submit" value="submit!!" id="submit"></div>
</form>
</body>
</html>

csrf_token是Django用于防止CSRF(跨站点请求伪造)攻击,对于POST请求是必须要加的。我们此处用的是GET的请求,所以{% csrf_token %}去掉也不会报错,如果要改成POST请求就将上面的HTML代码的get改成post。

成功调用静态资源后的页面如下:
在这里插入图片描述

6.2 动态数据的添加

  1. 新建templates/result.html并添加相关的模板标签,关于模板标签,可以参考:
    http://www.runoob.com/django/django-template.html
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>TestResult</title>
</head>
<body>
<ul>
   <li>id:{{ id }}</li>
   <li>minSalary:{{ minSalary }}</li>
   <li>maxSalary:{{ maxSalary }}</li>
   <li>workPlace:{{ workPlace }}</li>
   <li>jobName:{{ jobName }}</li>
</ul>
</body>
</html>
  1. 修改views.job逻辑
from django.shortcuts import render
from django.shortcuts import HttpResponse

# Create your views here.
from JobCrawler.models import Job

def query(request):
    return render(request,"query.html")

def job(request):
        if(request.method == "GET"):#处理GET方法
            if(request.GET.get("queryStr") == None):
                return HttpResponse("Query string is none!")
            else:
                job = Job.objects.filter(companyName=request.GET.get("queryStr"))
                if len(job) == 0:
                    return  HttpResponse("Query Result is empty")
                else:
                    return render(request,"result.html",context=job.all()[0].__dict__)
        return HttpResponse("Do Nothing")

最终的访问HTML如下:
在这里插入图片描述

七、总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值