晓林网 自建博客学习问题及解决办法 红字
做网站就不能离开数据库,除非你是做静态网站。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
10DATABASES={
'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' 这是修改时区,为了让系统时间跟当前中国的时间绑定。
在mysql中创建表等需要写sql语句,但在django不需要,一切都已经封装好了。数据库中的表是跟django中的类对应的,表的字段就对应着类的属性
比如我们需要这么一张表,表名:�Person, 字段有name , age等 ,如果用sql语句创建需要这么写:
1
2
3
4
5CREATE TABLE Person
(
name varchar(50),
ageint
)
而在django中,我们需要创建Python类来实现
打开blog/Model.py 文件, 创建Person类
1
2
3
4
5
6
7
8fromdjango.dbimportmodels
classPerson(models.Model):
name=models.CharField('姓名', max_length=50)
age=models.IntegerField('年龄', blank=True)
def__unicode__(self):
returnself.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 -*-
fromdjango.dbimportmodels
# Create your models here.
classTag(models.Model):
tag_name=models.CharField('标签', max_length=50)
tag_cn_name=models.CharField('中文名字', max_length=50, blank=True)
def__unicode__(self):
returnself.tag_name
classArticle(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):
returnself.title
classMeta:
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
5Migrationsfor'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
21perations to perform:
Synchronize unmigrated apps: staticfiles, blog, messages
Applyallmigrations: 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
7fromdjango.contribimportadmin
fromblog.modelsimportTag, 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
2mysql> use blog;
Database changed
查看数据库中所有的表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19mysql> 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 |
+----------------------------+
13rowsinset(0.00sec)
可以看到,两个表Tag, Article已经创建成功了.
系统会自动在表名前面加数据库的名字blog,合起来作为表名。
我们可以直接通过django的交互方式来对数据库进行操作,输入:
1
python manage.py shell
1
2
3
4
5Python2.7.5(default, Mar92014,22:15:05)
[GCC4.2.1Compatible Apple LLVM5.0(clang-500.0.68)] on darwin
Type"help","copyright","credits"or"license"formore information.
(InteractiveConsole)
>>>
跟python的交互方式很像
1
2
3
4
5
6
7
8
9
10>>>fromblog.modelsimportTag
>>> Tag.objects.all()#查找Tag表中所有的数据
[, ]
>>> 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')#插入一笔数据
当然,你也可以在mysql的操作台下通过sql语句来操作
打开终端,