Django 開發內容管理系統
用Django開發一個簡易的內容管理系統,比如顯示新聞的列表,點擊進去可以看內容詳情等,新聞發布網站。
一,搭建互不干擾的 Python 包開發環境
我們有的時候會發現,一個電腦上有多個項目,一個依賴 Django 1.8,另一個比較舊的項目又要用 Django 1.5,這時候怎么辦呢?
我們需要一個依賴包管理的工具來處理不同的環境。 如果不想搭建這個環境,可以直接去看 2.2
1.1 環境搭建
開發會用 virtualenv 來管理多個開發環境,virtualenvwrapper 使得virtualenv變得更好用
# 安裝: (sudo) pip install virtualenv virtualenvwrapper
Linux/Mac OSX 下:
修改~/.bash_profile或其它環境變量相關文件,添加以下語句
export WORKON_HOME=$HOME/.virtualenvs export PROJECT_HOME=$HOME/workspace source /usr/local/bin/virtualenvwrapper.sh
Windows 下:
pip install virtualenvwrapper-win
【可選】Windows下默認虛擬環境是放在用戶名下面的Envs中的,與桌面,我的文檔,下載等文件夾在一塊的。更改方法:計算機,屬性,高級系統設置,環境變量,添加WORKON_HOME,如圖(windows 10 環境變量設置截圖):
1.2 使用方法:
mkvirtualenv zqxt:創建運行環境zqxt
workon zqxt: 工作在 zqxt 環境
其它的:
rmvirtualenv ENV:刪除運行環境ENV
mkproject mic:創建mic項目和運行環境mic
mktmpenv :創建臨時運行環境
lsvirtualenv : 列出可用的運行環境
lssitepackages : 列出當前環境安裝了的包
創建的環境是獨立的,互不干擾,無需sudo權限即可使用 pip 來進行包的管理。
二,安裝軟件,開發 minicms 項目
2.1 創建一個開發環境 minicms
# Linux 或 Mac OSX mkproject minicms # windows mkvirtualenv minicms
Mac OSX 下的輸出示例:
mkproject minicms
New python executable in minicms/bin/python Installing setuptools, pip...done. Creating /Users/tu/YunPan/workspace//minicms Setting project for minicms to /Users/tu/YunPan/workspace/minicms (minicms)tu@mac ~/YunPan/workspace/minicms $
2.2 安裝 Django
pip install Django==1.8.3
2.3 創建項目 minicms 和 應用 news
django-admin.py startproject minicms cd minicms python manage.py startapp news
添加 news 到 settings.py 中的 INSTALLED_APPS 中。
2.4 規劃 news 中的欄目和每篇文章相關的字段
欄目:名稱,網址,簡介等
文章:標題,作者,網址,內容等
我們假設一篇文章只有一個作者(文章和作者是多對一的關系),一篇文章可以屬于多個欄目(欄目和文章是 多對多 的關系)
為了用到更多的情況,我們假設作者可以為空,欄目不能為空。
開寫 models.py
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models from django.utils.encoding import python_2_unicode_compatible @python_2_unicode_compatible class Column(models.Model): name = models.CharField('欄目名稱', max_length=256) slug = models.CharField('欄目網址', max_length=256, db_index=True) intro = models.TextField('欄目簡介', default='') def __str__(self): return self.name class Meta: verbose_name = '欄目' verbose_name_plural = '欄目' ordering = ['name'] # 按照哪個欄目排序 @python_2_unicode_compatible class Article(models.Model): column = models.ManyToManyField(Column, verbose_name='歸屬欄目') title = models.CharField('標題', max_length=256) slug = models.CharField('網址', max_length=256, db_index=True) author = models.ForeignKey('auth.User', blank=True, null=True, verbose_name='作者') content = models.TextField('內容', default='', blank=True) published = models.BooleanField('正式發布', default=True) def __str__(self): return self.title class Meta: verbose_name = '教程' verbose_name_plural = '教程'
2.5 創建數據庫
python manage.py makemigrations news python manage.py migrate
2.6 創建完數據庫后,用了一段時間,我們發現以前的文章的字段不合理
比如我們想記錄文章添加的日期,修改的日期,我們更改 models.py (不變動的大部分省去了,添加兩個字段)
...省略 class Article(models.Model): ...原來的字段省去 pub_date = models.DateTimeField('發表時間', auto_now_add=True, editable=True) update_time = models.DateTimeField('更新時間', auto_now=True, null=True) ...省略
這時候,我們對 models.py 進行了更改,這些字段數據庫中還沒有,我們要同步更改到數據庫中去:
python manage.py makemigrations news
You are trying to add a non-nullable field 'pub_date' to article without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
這段話的意思是 pub_date 字段沒有默認值,而且非Null 那么
1) 指定一個一次性的值供更改數據庫時使用。
2) 停止當前操作,在 models.py 中給定默認值,然后再來migrate。
我們選擇第一個,輸入 1
Select an option: 1
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now()
>>>timezone.now()
Migrations for 'news':
0002_auto_20150728_1232.py:
- Add field pub_date to article
- Add field update_time to article
這樣是生成了一個對表進行更改的 py 文件在 news/migrations 文件夾中,我們要執行更改
python manage.py migrate 或 python manage.py migrate news
2.7 創建一個腳本,導入一些數據到數據庫中
我們導入一些演示數據:
欄目: [<Column: 體育新聞>, <Column: 社會新聞>, <Column: 科技新聞>]
文章:[<Article: 體育新聞_1>, <Article: 體育新聞_2>, <Article: 體育新聞_3>, <Article: 體育新聞_4>, <Article: 體育新聞_5>, <Article: 體育新聞會>, <Article: 體育新聞_7>, <Article: 體育新聞_8>, <Article: 體育新聞_9>, <Article: 體育新聞_10>, <Article: 社會新聞_1>, <Article: 社新聞_2>,'...(remaining elements truncated)...']
create_demo_records.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2015-07-28 20:38:38 # @Author : Weizhong Tu (mail@tuweizhong.com) # @Link : http://www.tuweizhong.com ''' create some records for demo database ''' from minicms.wsgi import * from news.models import Column, Article def main(): columns_urls = [ ('體育新聞', 'sports'), ('社會新聞', 'society'), ('科技新聞', 'tech'), ] for column_name, url in columns_urls: c = Column.objects.get_or_create(name=column_name, slug=url)[0] # 創建 10 篇新聞 for i in range(1, 11): article = Article.objects.get_or_create( title='{}_{}'.format(column_name, i), slug='article_{}'.format(i), content='新聞詳細內容: {} {}'.format(column_name, i), )[0] article.column.add(c) if __name__ == '__main__': main() print("Done!")
假設這個文件被保存為 create_demo_records.py (和 manage.py 放在一塊,同一個文件夾下)
運行腳本 導入數據:
python create_demo_records.py
Done!
終端上顯示一個 Done! 就這樣 Duang 的一下,數據就導進去了!
上面所有操作的代碼: minicms1.zip
第一次提交:github: https://github.com/twz915/django-minicms/tree/dff31758173852344af5d8d5b4fad858a0b16907
內容管理系統繼續開發,點此查看第二部分
來自: http://www.ziqiangxuetang.com/django/django-cms-develop.html