Django 開發內容管理系統

jopen 8年前發布 | 18K 次閱讀 Django Web框架

用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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!