晓林网 自建博客学习问题及解决办法 红字
数据库设置
做网站就不能离开数据库,除非你是做静态网站。django中可以很方便的跟数据库打交道。
我们常见的数据库有mysql, oracle, postgresql, django自带的sqllite , 还有NOSQL类型的mongodb,在这里我们使用的是mysql
安装mysql
1
|
sudo easy_isntall mysql
|
安装完成后,在终端中输入命令登陆mysql:
1
|
mysql
-
u root
-
p
|
然后输入你安装mysql时候设置的密码,如果没有设置,直接回车就好了
我们需要为工程创建一个数据库, 数据库名字就叫blog好了:
1
|
mysql> create database blog default charset
=
utf8;
|
设置默认字符集为utf8,以便支持中文。不要忘了在命令最后加个分号,不然命令是无效的。
打开myblog/settings.py 文件,修改DATABASE项:
1
2
3
4
5
6
7
8
9
10
|
DATABASES
=
{
'default'
: {
'ENGINE'
:
'django.db.backends.mysql'
,
'NAME'
:
'blog'
,
'USER'
:
'root'
,
'PASSWORD'
: '',
'HOST'
:
'localhost'
,
'PORT'
:
'3306'
,
}
}
|
这样就能让django支持mysql,之后django就能直接操作数据库了。
顺便把settings.py文件下面的 TIME_ZONE='UTC' 改为 TIME_ZONE = 'Asia/Shanghai' 这是修改时区,为了让系统时间跟当前中国的时间绑定。
Django Model
在mysql中创建表等需要写sql语句,但在django不需要,一切都已经封装好了。数据库中的表是跟django中的类对应的,表的字段就对应着类的属性
比如我们需要这么一张表,表名:Person, 字段有name , age等 ,如果用sql语句创建需要这么写:
1
2
3
4
5
|
CREATE TABLE Person
(
name varchar(
50
),
age
int
)
|
而在django中,我们需要创建python类来实现
打开blog/Model.py 文件, 创建Person类
1
2
3
4
5
6
7
8
|
from
django.db
import
models
class
Person(models.Model):
name
=
models.CharField(
'姓名'
, max_length
=
50
)
age
=
models.IntegerField(
'年龄'
, blank
=
True
)
def
__unicode__(
self
):
return
self
.name
|
可以看到,我们创建了2个属性,也就是数据库表中的2个字段 name 的中文标识是 '姓名',最大长度是50个字符。第二个字段的 blank=True是表示这个字段可以为空
每个类都继承自model.Model.注意__unicode__ ,这个的是用来说明对象Person的表达式,告诉django用这个字段来表达自己。这个是在后台管理中的显示用的,在后面的教程中会讲到
以上是举得例子,那我们这个blog如何建表呢:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# -*- coding: utf-8 -*-
from
django.db
import
models
# Create your models here.
class
Tag(models.Model):
tag_name
=
models.CharField(
'标签'
, max_length
=
50
)
tag_cn_name
=
models.CharField(
'中文名字'
, max_length
=
50
, blank
=
True
)
def
__unicode__(
self
):
return
self
.tag_name
class
Article(models.Model):
title
=
models.CharField(
'标题'
, max_length
=
100
)
tag
=
models.ManyToManyField(Tag, max_length
=
50
, blank
=
True
)
date_time
=
models.DateTimeField(
'日期'
, auto_now_add
=
True
)
content
=
models.TextField(
'内容'
, blank
=
True
, null
=
True
)
def
__unicode__(
self
):
return
self
.title
class
Meta:
verbose_name
=
'文章'
verbose_name_plural
=
'文章'
ordering
=
[
'-date_time'
]
|
verbose_name 属性也是为了在后台管理中显示用的, ordering是排序用的,['-date_time']就表示按时间倒序
ManyToManyField 是表示这是一个多对多的字段。对应的是Tag表
问题1: Error loading MySQLdb module: No module named MySQLdb
解决办法:
sudo apt-get install python-MySQLdb
问题2:SyntaxError: Non-ASCII character '\xe6' in file /home/jhy/myblog/blog/models.py on line 7, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
解决办法:from __future__ import unicode_literals
# encoding: utf-8 添加这句
from django.db import models
同步数据库
blog应用的所有类都已经写好了,怎么让mysql开始创建表呢。
打开终端,首先输入:
1
|
python manage.py makemigrations
|
输出:
1
2
3
4
5
|
Migrations
for
'blog'
:
0001_initial
.py:
-
Create model Article
-
Create model Tag
-
Add field tag to article
|
再输入命令:
1
|
python manage.py migrate
|
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
perations to perform:
Synchronize unmigrated apps: staticfiles, blog, messages
Apply
all
migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Creating table blog_tag
Creating table blog_article
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states... DONE
Applying contenttypes.
0001_initial
... OK
Applying auth.
0001_initial
... OK
Applying admin.
0001_initial
... OK
Applying contenttypes.
0002_remove_content_type_name
... OK
Applying auth.
0002_alter_permission_name_max_length
... OK
Applying auth.
0003_alter_user_email_max_length
... OK
Applying auth.
0004_alter_user_username_opts
... OK
Applying auth.
0005_alter_user_last_login_null
... OK
Applying auth.
0006_require_contenttypes_0002
... OK
Applying sessions.
0001_initial
... OK
|
表创建完后,系统会接着提示你是否要创建超级用户,这个用户是为了登陆后台管理用的,你可以自己输入一个超级用户的账号,密码你可以自己输入,然后再随便输入一个邮箱地址就行了。如果在这个步骤你忘了创建,也可以通过命令单独创建超级用户:
1
2
3
4
5
6
|
^CbxldeMac:myblog bxl$ python manage.py createsuperuser
Username (leave blank to use
'bxl'
): admin
Email address: admin@
123.com
Password:
Password (again):
Superuser created successfully.
|
注意Password后面是空的,因为在linux系统下输入密码是看不到的
在blog/admin.py中注册这两个表,如果不注册,在后台管理页面中是看不到这2个表的:
1
2
3
4
5
6
7
|
from
django.contrib
import
admin
from
blog.models
import
Tag, Article
# Register your models here.
admin.site.register(Tag)
admin.site.register(Article)
|
代码部分就做完了,在浏览器中输入 127.0.0.1:8000/admin ,会出现登录界面:
输入你刚才创建的账号和密码后如果出现下面的界面,就表示你的表创建成功了:
也可登录mysql中查看表是否创建成功,打开终端,输入:
1
|
mysql
-
u root
-
p
|
使用数据库blog:
1
2
|
mysql> use blog;
Database changed
|
查看数据库中所有的表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
mysql> show tables;
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
| Tables_in_blog1 |
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| blog_article |
| blog_article_tag |
| blog_tag |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
13
rows
in
set
(
0.00
sec)
|
可以看到,两个表Tag, Article已经创建成功了.
系统会自动在表名前面加数据库的名字blog,合起来作为表名。
Django Shell
我们可以直接通过django的交互方式来对数据库进行操作,输入:
1
|
python manage.py shell
|
1
2
3
4
5
|
Python
2.7
.
5
(default, Mar
9
2014
,
22
:
15
:
05
)
[GCC
4.2
.
1
Compatible Apple LLVM
5.0
(clang
-
500.0
.
68
)] on darwin
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
(InteractiveConsole)
>>>
|
跟python的交互方式很像
1
2
3
4
5
6
7
8
9
10
|
>>>
from
blog.models
import
Tag
>>> Tag.objects.
all
()
#查找Tag表中所有的数据
[<Tag: News>, <Tag: Tech>]
>>> first
=
Tag.objects.get(
id
=
1
)
#查找Tag表中id=1的数据
>>> first.tag_name
#显示这条数据的tag_name信息
u
'News'
>>> first.tag_cn_name
#显示这条数据的tag_cn_name信息
u
'\u65b0\u95fb'
>>> Tag.objects.create(tag_name
=
'python'
, tag_cn_name
=
'python'
)
#插入一笔数据
<Tag: Tag
object
>
|
当然,你也可以在mysql的操作台下通过sql语句来操作
打开终端,