这篇内容比较长,我也是边做边写。打算烦的时候就回来看看👀 ,亲测一下到底有木有那么神奇~
一、环境搭建及项目准备
1,使用工具
目前python3只有一个版本,不存在多开发环境冲突的问题。
存在开发环境冲突的建议使用virtualenv来管理多个开发环境。
编辑器:Pycharm,python开发必备神器。
数据库管理工具: Navicat Premium, 数据库管理必备神器。
操作系统:OS X EI Capitan
python版本: 3.6.0
django版本: 1.11b1
数据库:pymysql 0.7.11
谷歌浏览器开发者工具
开发人员:具有较好的python基础和数据库基础、一定的前端基础、并对django又所了解。
2,创建一个项目和一个应用
在Pycharm里面可以填上application的名字,就可以自动创建app。
2. 有时需要在终端运行命令,比如:python manage.py runserver,Pycharm可以少打这么几个字 python3 manage.py ... :
在里面只写命令就行runserver 。
现在打开localhost就可以看到一个最简单的web-server应用已经跑起来了。
二、数据库和Models
1,设置MySQL数据库
在项目工程文件的setting文件中修改:
在databases下将sqlite3配置注释,添加新的配置说明。
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'main',
'USER': 'username',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
这个文件内还可以设置时区TIME_ZONE,就默认UTC就可以了。
还需要在INSTALLED_APPS字段里有添加app名称:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corpus',
]
激活MySQL:
makemigrations
migrate
为了方便查阅数据库,我们可以不使用Navicate,而是利用pycharm的Database:
大概步骤如下,不上图了。
下载驱动
填入数据库的名字,mysql的用户名和密码,进行连接。
成功后点击右下角的apply和OK。
然后嗒嗒,可以看到数据库里的表和内容了:
2,编写Models
不记得哪里读到,数据库是一个网站的灵魂。设计数据库之前先分析网站需求。
网站功能主要分为两个部分,梵文佛经展示(包括原文,各类注释等)和 用户信息管理。
1)经文段的展示:包括梵文原文,梵語非連聲形式,現代漢譯,注,護譯,什譯,读者评论(待定:读者修改、书签)。
2)注册用户信息:昵称,邮箱,密码,评论的文章(待定:修改的文章、添加书签)。
我们允许用户对一篇经文多次评论(待定:或者修改或者书签)。
多对多关系 -> manytomany
并且会有不止一篇经文,我们需要对经文分类,比如有的属于法华经,有的属于俱舍论。
一对多关系 -> foreignkey 谁多写在谁里面
所以,目前为止,我们需要创建用户和经文,经文片段,评论几个数据模型。
用户模型
(参考文献[1])[1]是这样做的:在django中内置有django.contrib.auth.models.User模块,这个模块字段有限,但是我们可以继承django.contrib.auth.models.AbstractUser这个类来扩充字段,之所以不自己写User模块,是因为内置的User模块使整个用户验证系统非常容易实现,详见django文档。
一开始就是按照这个来做的用户模型,代码如下:
class NewUser(AbstractUser):
profile = models.CharField('profile', default='',max_length=256)
def __str__(self):
return self.username
在sqllite下没有问题。在mysql下一直报错,原因大概是每行不能超过65535。这个bug搞了好久啊。
不要忘了如果数据是utf8编码的话,要占一个字符算三。
查阅stackoverflow大都建议修改表结构,而不是修改数据库配置文件。
改后如下:
class NewUser(models.Model):
user = models.OneToOneField(User)
profile = models.CharField('profile', blank=True, null=True, max_length=255)
def __str__(self):
return self.user.username
class Meta:
verbose_name = '用戶'
verbose_name_plural = verbose_name
经文模型
这部分需要注意charfield和textfield的使用。65535是不算textfield的,所以大段内容长内容最好用textfield避免超字数的问题。详见django文档-Model field reference
class Column(models.Model):
name = models.CharField('column_name', max_length=100) # 经文名称
intro = models.TextField('introduction', max_length=2048, default='') # 经文介绍
ver = models.TextField('version', max_length=2048, default='') # 版本信息
comment_num = models.IntegerField(default=0) # 評論數目
def __str__(self):
return self.name
class Meta:
verbose_name = '經文'
verbose_name_plural = verbose_name
ordering = ['name']
经文片段模型
class Article(models.Model): # 经文段
column = models.ForeignKey(Column, blank=True, null=True, verbose_name='belong to')
level = models.IntegerField() # 层次
parent = models.IntegerField(blank=True, null=True) # 父节点
child = models.IntegerField(blank=True, null=True) # 子节点
chapter = models.IntegerField() # 第几品
section = models.IntegerField() # 第几段
sentence = models.IntegerField() # 第几句 层次为1,句子为0
code = models.CharField(max_length=64) # 编码
san = models.TextField(max_length=8192, blank=True, null=True) ## 梵語
san2 = models.TextField(max_length=8192, blank=True, null=True) ## 梵语原型
santag = models.TextField(max_length=8192, blank=True, null=True) ## 注
dir = models.TextField(max_length=8192, blank=True, null=True) ## 现代汉译
note = models.TextField(max_length=8192, blank=True, null=True) ## 注
d = models.TextField(max_length=8192, blank=True, null=True) ## 一种译文
k = models.TextField(max_length=8192, blank=True, null=True) ## 另外一种译文
dnote = models.TextField(max_length=8192, blank=True, null=True) ## 翻译的说明
knote = models.TextField(max_length=8192, blank=True, null=True) ## 翻译的说明
def __str__(self):
return self.code
class Meta:
verbose_name = '經文片段'
verbose_name_plural = verbose_name
评论模型
class Comment(models.Model):
user = models.ForeignKey('NewUser', null=True)
article = models.ForeignKey(Column, null=True)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True, editable=True)
def __str__(self):
return self.content
class Meta:
verbose_name = '評論'
verbose_name_plural = verbose_name
修改model三步走
remember the three-step guide to making model changes:
Change your models (in models.py).
Run python manage.py makemigrations to create migrations for those changes
Run python manage.py migrate to apply those changes to the database.
看看数据库,表都建立好啦。
三、Admin
createsuperuser
runserver
打开“127.0.0.1:8000/admin” 页面会进入登陆页面,输入刚才的用户名和密码,即可进入管理页面:
界面很友好,enjoy吧~
结尾的话
Django是个大而全的框架,其实并不适合小白。Models算是框架的核心和难点吧。感觉自己一直在趟坑。
但是!不能灰心,看看Baker-Miller Pink,平静一下心情,继续趟坑!
先立个flag,这个做完一定好好总结一下django。
参考文献