您的位置:首页 > 编程语言 > Go语言

Django 搭建简易博客(2)

2016-09-16 01:12 357 查看


Admin和Models以及Views和URL


一、实验说明

下述介绍为实验楼默认环境,如果您使用的是定制环境,请修改成您自己的环境介绍。


1. 环境登录

无需密码自动登录,系统用户名shiyanlou


2. 环境介绍

本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:
LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令
Firefox:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的HTML/JS页面即可
GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器


3. 环境使用

使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。

实验报告可以在个人主页中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。


二、Models


1.Django Model

每一个Django Model都继承自django.db.models.Model
在Model当中每一个属性attribute都代表一个database field
通过Django Model API可以执行数据库的增删改查, 而不需要写一些数据库的查询语句


2.设置数据库

Django项目建成后, 默认设置了使用SQLite数据库, 在 
my_blog/my_blog/setting.py
 中可以查看和修改数据库设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}


还可以设置其他数据库, 如MySQL, PostgreSQL, 现在为了简单, 使用默认数据库设置


3.创建models

my_blog/article/models.py
下编写如下程序:
from django.db import models

# Create your models here.
class Article(models.Model) :
title = models.CharField(max_length = 100)  #博客题目
category = models.CharField(max_length = 50, blank = True)  #博客标签
date_time = models.DateTimeField(auto_now_add = True)  #博客日期
content = models.TextField(blank = True, null = True)  #博客文章正文

#python2使用__unicode__, python3使用__str__
def __str__(self) :
return self.title

class Meta:  #按时间下降排序
ordering = ['-date_time']


其中
__str__(self)
 函数Article对象要怎么表示自己, 一般系统默认使用
<Article:
Article object>
 来表示对象, 通过这个函数可以告诉系统使用title字段来表示这个对象
CharField 用于存储字符串, max_length设置最大长度
TextField 用于存储大量文本
DateTimeField 用于存储时间, auto_now_add设置True表示自动设置对象增加时间


4.同步数据库

$ python manage.py migrate #命令行运行该命令


因为我们已经执行过该命令会出现如下提示
Operations to perform:
Apply all migrations: admin, contenttypes, sessions, auth
Running migrations:
No migrations to apply.
Your models have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.


那么现在需要执行下面的命令
$ python manage.py makemigrations
#得到如下提示
Migrations for 'article':
0001_initial.py:
- Create model Article


现在重新运行以下命令
$ python manage.py migrate
#出现如下提示表示操作成功
Operations to perform:
Apply all migrations: auth, sessions, admin, article, contenttypes
Running migrations:
Applying article.0001_initial... OK


migrate命令按照app顺序建立或者更新数据库, 将models.py与数据库同步




5.Django Shell

现在我们进入Django中的交互式shell来进行数据库的增删改查等操作
$ python manage.py shell
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>


这里进入Django的shell和python内置的shell是非常类似的

>>> from article.models import Article
>>> #create数据库增加操作
>>> Article.objects.create(title = 'Hello World', category = 'Python', content = 'Let us add a database item')
<Article: Article object>
>>> Article.objects.create(title = 'Django Blog Study', category = 'Python', content = 'Django Blog Tutorial')
<Article: Article object>

>>> #all和get的数据库查看操作
>>> Article.objects.all()  #查看全部对象, 返回一个列表, 无对象返回空list
[<Article: Article object>, <Article: Article object>]
>>> Article.objects.get(id = 1)  #返回符合条件的对象
<Article: Article object>

>>> #update数据库修改操作
>>> first = Article.objects.get(id = 1)  #获取id = 1的对象
>>> first.title
'Hello World'
>>> first.date_time
datetime.datetime(2014, 12, 26, 13, 56, 48, 727425, tzinfo=<UTC>)
>>> first.content
'我们来做一个简单的数据库增加操作'
>>> first.category
'Python'
>>> first.content = 'Hello World, How are you'
>>> first.content  #再次查看是否修改成功, 修改操作就是点语法
'Hello World, How are you'

>>> #delete数据库删除操作
>>> first.delete()
>>> Article.objects.all()  #此时可以看到只有一个对象了, 另一个对象已经被成功删除
[<Article: Article object>]

Blog.objects.all()  # 选择全部对象
Blog.objects.filter(caption='blogname')  # 使用 filter() 按博客题目过滤
Blog.objects.filter(caption='blogname', id="1") # 也可以多个条件
#上面是精确匹配 也可以包含性查询
Blog.objects.filter(caption__contains='blogname')

Blog.objects.get(caption='blogname') # 获取单个对象 如果查询没有返回结果也会抛出异常

#数据排序
Blog.objects.order_by("caption")
Blog.objects.order_by("-caption")  # 倒序

#如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),使用多个参数就可以了
Blog.objects.order_by("caption", "id")

#连锁查询
Blog.objects.filter(caption__contains='blogname').order_by("-id")

#限制返回的数据
Blog.objects.filter(caption__contains='blogname')[0]
Blog.objects.filter(caption__contains='blogname')[0:3]  # 可以进行类似于列表的操作


当然还有更多的API, 可以查看官方文档,退出只需要输入
quit()


三、Adimn


1.Admin简介

Django有一个优秀的特性, 内置了Django admin后台管理界面, 方便管理者进行添加和删除网站的内容.


2.设置Admin

新建的项目系统已经为我们设置好了后台管理功能

可以在
my_blog/my_blog/setting.py
中查看
INSTALLED_APPS = (
'django.contrib.admin',  #默认添加后台管理功能
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article'
)


同时也已经添加了进入后天管理的url, 可以在
my_blog/my_blog/urls.py
中查看
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
# Examples:
# url(r'^$', 'my_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),

url(r'^admin/', include(admin.site.urls)),  #可以使用设置好的url进入网站后台
url(r'^$', 'article.views.home'),
)


3.创建超级用户

使用如下命令账号创建超级用户(如果使用了python manage.py syncdb会要求你创建一个超级用户, 该命令已经过时, 不再推荐使用)
$ python manage.py createsuperuser
Username (leave blank to use 'andrew_liu'): root
Email address:
Password:
Password (again):
Superuser created successfully.


输入用户名, 邮箱, 密码就能够创建一个超级用户

启动应用:
$ python manage.py runserver localhost:9000


现在可以在浏览器中输入
localhost:9000/admin
输入账户和密码进入后台管理, 如下:



登陆进入



但是你会发现并没有数据库信息的增加和删除, 现在我们在
my_blog/article/admin.py
中增加代码:
from django.contrib import admin
from article.models import Article

# Register your models here.
admin.site.register(Article)


保存后, 再次刷新页面, 
localhost:9000/admin




对于管理界面的外观的定制还有展示顺序的修改就不详细叙述了, 感兴趣的可以查看官方文档...


4.使用第三方插件

Django现在已经相对成熟, 已经有许多不错的可以使用的第三方插件可以使用, 这些插件各种各样, 现在我们使用一个第三方插件使后台管理界面更加美观, 目前大部分第三方插件可以在Django Packages 中查看,

尝试使用django-admin-bootstrap美化后台管理界面


安装

$ sudo pip install bootstrap-admin


配置

然后在
my_blog/my_blog/setting.py
中修改INSTALLED_APPS
INSTALLED_APPS = (
'bootstrap_admin',  #一定要放在`django.contrib.admin`前面
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article',
)

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django.core.context_processors.request',
)
BOOTSTRAP_ADMIN_SIDEBAR_MENU = True


保存后, 再次刷新页面, 
localhost:9000/admin




界面是不是美腻了许多...


四、Views和URL


1.网页程序的逻辑

request进来->从服务器获取数据->处理数据->把网页呈现出来
url设置相当于客户端向服务器发出request请求的入口, 并用来指明要调用的程序逻辑
views用来处理程序逻辑, 然后呈现到template(一般为GET方法, POST方法略有不同)
template一般为html+CSS的形式, 主要是呈现给用户的表现形式


2.简单Django Views和URL

Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 然后返回HTTPResponse,

那么那么开始在
my_blog/article/views.py
中编写简单的逻辑
#现在你的views.py应该是这样
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def home(request):
return HttpResponse("Hello World, Django")


那么如何使这个逻辑在http请求进入时, 被调用呢, 这里需要在
my_blog/my_blog/urls.py
中进行url设置
from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
# Examples:
# url(r'^$', 'my_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),

url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'article.views.home'),  #由于目前只有一个app, 方便起见, 就不设置include了
)


url()函数有四个参数, 两个是必须的:regex和view, 两个可选的:kwargs和name

regex是regular expression的简写,这是字符串中的模式匹配的一种语法, Django 将请求的URL从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。 更多正则表达式的使用可以查看Python正则表达式

view当 Django匹配了一个正则表达式就会调用指定的view逻辑, 上面代码中会调用
article/views.py
中的home函数

kwargs任意关键字参数可传一个字典至目标view
name命名你的 URL, 使url在 Django 的其他地方使用, 特别是在模板中

现在在浏览器中输入
localhost:9000
应该可以看到下面的界面




3.Django Views和URL更近一步

很多时候我们希望给view中的函数逻辑传入参数, 从而呈现我们想要的结果

现在我们这样做, 在
my_blog/article/views.py
加入如下代码:
def detail(request, my_args):
return HttpResponse("You're looking at my_args %s." % my_args)


my_blog/my_blog/urls.py
中设置对应的url,
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'my_blog.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),

url(r'^admin/', include(admin.site.urls)),
url(r'^$', 'article.views.home'),
url(r'^(?P<my_args>\d+)/$', 'article.views.detail', name='detail'),
)


^(?P<my_args>\d+)/$
这个正则表达式的意思是将传入的一位或者多位数字作为参数传递到views中的detail作为参数,
其中
?P<my_args>
定义名称用于标识匹配的内容

一下url都能成功匹配这个正则表达数
http://localhost:9000/1000/
http://localhost:9000/9/

尝试传参访问数据库

修改在
my_blog/article/views.py
代码:
from django.shortcuts import render
from django.http import HttpResponse
from article.models import Article

# Create your views here.
def home(request):
return HttpResponse("Hello World, Django")

def detail(request, my_args):
post = Article.objects.all()[int(my_args)]
str = ("title = %s, category = %s, date_time = %s, content = %s"
% (post.title, post.category, post.date_time, post.content))
return HttpResponse(str)


这里最好在admin后台管理界面增加几个Article对象, 防止查询对象为空, 出现异常

现在可以访问http://localhost:9000/1/

显示如下数据表示数据库访问正确(这些数据都是自己添加的), 并且注意Article.objects.all()返回的是一个列表



小结:
如何编写views和设置url
如何通过url向views传参
如何通过参数来访问数据库资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: