我们来从头到尾搭建一个app,让数据库中的数据能够传递给前台,显示在网页中。
ref:http://blog.csdn.net/viease/article/details/45093875
创建一个工程
cd 到要创建工程的文件夹下,执行命令:
django-admin startproject my_project
创建第一个页面
my_project/my_project文件夹中创建文件:
views.py
from django.http import HttpResponse
def first_page(request):
return HttpResponse("Cool snow!")
创建URL和函数之间的映射,编辑urls.py文件:
from django.conf.urls import url,include
from django.contrib import admin
from views import first_page#引入对应的函数
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', first_page),#添加映射
]
这个时候启动服务器,
python manage.py runserver
结果:
创建一个app
tip:Django只有在app里面才能引用数据库,所以必须创建app
在外层my_project文件夹下,terminal执行:
python manage.py startapp app1
配置settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app1',#添加我们自己的app
]
配置应用对应的urls.py
(注意这里是在my_project/my_project/urls.py,不是app1文件夹中的urls.py)
from django.conf.urls import url,include
from django.contrib import admin
from views import first_page
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', first_page),
url(r'^app1/', include('app1.urls')),#添加这句
]
修改app1视图文件:
app1/views.py
from django.http import HttpResponse
def first_page(request):
return HttpResponse("happy snow!")
配置app1内部URL映射:
app1/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from views import first_page# add
urlpatterns = [
url(r'^$', first_page)
]
上面的结果就对了,注意体会链接的形式
配置数据库
my_project/my_project/settings.py
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# 注释掉原来的数据库,添加我们的Mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'snowtest0106', #我们数据库名称
'USER': 'root',
'PASSWORD': '******', #填写你的密码
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
my_project/my_project/_init_.py
import pymysql
pymysql.install_as_MySQLdb()
检查是否连接成功:
python manage.py shell
>>>from django.db import connection
>>>cursor = connection.cursor()
不报错就对了
使用数据库
编辑models.py
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class myStudent(models.Model):
def __str__(self):
return self.name
name = models.CharField(max_length=20)
terminal执行
python manage.py makemigrations app1
python manage.py migrate
这个时候,再去看我们的数据库,就有刚刚创建的表了,我是用navicat来管理数据库的:
这里,我在数据库里面添加了一条记录,snowy,一会儿访问数据库的时候要用到
数据库中的id字段是django在创建数据库的时候自动添加的
让数据库的内容显示到网页中
app1/views.py
from django.http import HttpResponse
from models import myStudent
def first_page(request):
student_list = myStudent.objects.all()
student_str = map(str, student_list)
return HttpResponse("<p>" + ''.join(student_str) + "</p>")
启动服务器,运行:
这时候,数据库里面的snowy被显示出来
到此,我们的目标已经大致完成了,但是可以看出来,这种方式,虽然实现了结果,但是并不符合django的MVC编程思想。我们要把模板和数据分开来,怎么办呢?
my_project目录下创建template文件,并添加我们的模板html,这里是hello.html
hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{hello}}
</body>
</html>
修改settings.py:’DIRS’: [BASE_DIR+”/templates”,],
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR+"/templates",],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
app1/views.py
from models import myStudent
from django.shortcuts import render
def first_page(request):
student_list = myStudent.objects.all()
student_str = map(str, student_list)
context = {}
context['hello'] = ''.join(student_str)
# context['hello'] = 'hello yibo'
return render(request, 'hello.html',context)
这个时候启动服务器,运行:
大功告成
跟上面的结果一样,但是逻辑不一样哦~