實戰Django:網絡相冊Part1

這個實例與上個實例同樣,源自《Django Web開發指南》,捨得根據Django 1.7.1的特性進行了從新編寫。python

《Django Web開發指南》中所用的Django是1.0版,和如今的最新版本相比,有很大差別,好比通用視圖、URL、靜態文件的處理等等。最初作這本書的實例時,這些變化曾給捨得帶來很大的困擾,還好,實例作得多了,慢慢掌握了一些規律,最終把這些實例修改爲在Django 1.7.1下能夠運行的版本。數據庫

 

1.建立項目和應用 django


咱們先來建立本實例的項目,在dos命令提示符下轉到Scripts文件夾(如「c:\python32\Scripts」),而後運行以下命令:瀏覽器

$ django-admin startproject gallery

沒有任何錯誤提示的話,說明項目建立成功了,而後在dos命令提示符下繼續輸入命令,進入項目文件夾:服務器

cd gallery

開始建立應用,在dos命令提示符下輸入命令:session

$ python manage.py startapp items

命令執行完後,gallery文件夾下會多出一個叫items的文件夾,應用就建好了。app

2.創建模型ide


編輯items/models.py文件,象下面這樣:佈局

items/models.py:ui

from django.db import models
from django.db.models import permalink

from gallery.fields import ThumbnailImageField

class Item(models.Model):
    name = models.CharField(max_length=250)
    description = models.TextField()

    class Meta:
        ordering = ['name']
        
    def __str__(self):
        return self.name
        
    @permalink
    def get_absolute_url(self):
        return ('item_detail', None, {'pk': self.id})

class Photo(models.Model):
    item = models.ForeignKey(Item)
    title = models.CharField(max_length=100)
    image = ThumbnailImageField(upload_to='photos')
    caption = models.CharField(max_length=250, blank=True)
        
    class Meta:
        ordering = ['title']
        
    def __str__(self):
        return self.title

    @permalink
    def get_absolute_url(self):
        return ('photo_detail', None, {'pk': self.id})

咱們在Photo類里加入了一個image字段,這裏的ThumbnailImageField意味着要調用一個縮略圖處理程序,咱們會在下一步講到它。upload_to='photos' 則是指明瞭圖片上傳的文件夾,這個photos文件夾若不存在,程序會自動建立。

3.編寫縮略圖處理程序


items/models.py中第三行,咱們使用了這樣的導入語句:

from gallery.fields import ThumbnailImageField

這裏的gallery表示gallery文件夾,fields表示fields.py這個文件,ThumbnailImageField則是fields.py中的一個類,這是咱們用來處理圖片縮略圖的程序,下面咱們來編寫它。

在gallery文件夾下建立一個叫fields.py的文件,而後在裏面添加如下內容:

gellery/fileds.py(注意這個文件不要放在項目根目錄下,而應該和settings.py放在同一個文件夾):

from django.db.models.fields.files import ImageField, ImageFieldFile
from PIL import Image
import os

def _add_thumb(s):
    """
    往圖片文件名裏添加'.thumb'
    """
    parts = s.split(".")
    parts.insert(-1, "thumb")
    if parts[-1].lower() not in ['jpeg', 'jpg']:
        parts[-1] = 'jpg'
    return ".".join(parts)

class ThumbnailImageFieldFile(ImageFieldFile):
    def _get_thumb_path(self):
        return _add_thumb(self.path)
    thumb_path = property(_get_thumb_path)
    
    def _get_thumb_url(self):
        return _add_thumb(self.url)
    thumb_url = property(_get_thumb_url)

    def save(self, name, content, save=True):
        super(ThumbnailImageFieldFile, self).save(name, content, save)
        img = Image.open(self.path)
        img.thumbnail(
            (self.field.thumb_width, self.field.thumb_height),
            Image.ANTIALIAS
        )
        img.save(self.thumb_path)

    def delete(self, save=True):
        if os.path.exists(self.thumb_path):
            os.remove(self.thumb_path)
        super(ThumbnailImageFieldFile, self).delete(save)


class ThumbnailImageField(ImageField):
    """
    生成JPEG格式的縮略圖,
    接受兩個可選參數,縮略圖的寬和高,默認設置爲128px;
    """
    attr_class = ThumbnailImageFieldFile

    def __init__(self, thumb_ thumb_height=128, *args, **kwargs):
        self.thumb_width = thumb_width
        self.thumb_height = thumb_height
        super(ThumbnailImageField, self).__init__(*args, **kwargs)

注意,把這個文件儲存爲UTF-8編碼。

4.安裝PIL


注意在fields.py中的第2行,咱們使用了這樣的導入語句:

from PIL import Image

這個PIL是一個經常使用的Python類庫,咱們須要先安裝它,才能用它來進行縮略圖處理。

在Windows平臺的Python 3.2環境下,捨得推薦安裝這個版本:

https://pypi.python.org/pypi/Pillow/2.6.0

找到其中的Pillow-2.6.0.win32-py3.2.exe (md5) ,下載下來以後,直接安裝就能夠了。注意,這是適用於Python 32位的版本。

5.配置媒體文件路徑


咱們要創建一個文件夾來儲存上傳的圖片,在項目根文件夾下創建一個叫media的文件夾,建好以後你的項目文件夾應該是這樣的結構:

gallery/
    manage.py
    gallery/
    items/
    media/

這個路徑須要加入到配置文件中,編輯gallery/settings.py,在末尾加入以下內容

gallery/settings.py:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

第一行是媒體文件的URL,定義了MEDIA_URL,程序會自動在連接中插入「/meida/」,這個很是關鍵,若是沒有它,圖片的連接將沒法正確顯示。

MEDIA_ROOT則是媒體文件的儲存路徑,定義了這個屬性以後,上傳的圖片會自動儲存到這裏。若是不指定MEDIA_ROOT,程序會在項目根目錄下直接建立photos文件夾。

 

6.激活模型


首先修改gallery/settings.py這個文件,找到INSTALLED_APPS這段設置,把它改爲下面這個樣子:

gallery/settings.py:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'items',
)

編輯settings.py的時候,建議順便修改一下語言和時區的設置,具體的方法請參考:《實戰Django:官方實例Part1》

而後在dos命令提示符下運行以下命令:

$ python manage.py makemigrations items

繼續在dos命令提示符下運行命令:

$ python manage.py migrate

這樣,就把數據庫建好了。

7.建立管理員帳號


在dos命令提示符下運行以下命令:
$ python manage.py createsuperuser

而後依次輸入admin,你的郵箱,輸入兩次密碼,完成建立管理員的操做。

8.在管理界面註冊應用


編輯items/admin.py 文件,讓它變成下面這個樣子:

items/admin.py

from django.contrib import admin
from items.models import Item, Photo

class PhotoInline(admin.TabularInline):
    model = Photo

class ItemAdmin(admin.ModelAdmin):
    inlines = [PhotoInline]

admin.site.register(Item, ItemAdmin)    
admin.site.register(Photo)

咱們在這裏加了一個ItemAdmin,用來關聯Items和Photos兩個模型,inlines屬性用來設定管理頁面中照片的佈局。

9.啓動服務器


在dos命令提示符下運行以下命令:

$ python manage.py runserver

命令執行後,你會看到相似這樣的字符出現:

December 07, 2014 - 21:28:44
Django version 1.7.1, using settings 'gallery.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

這就表示服務器已經成功啓動了.

咱們先訪問一下管理界面,打開瀏覽器,在地址欄內輸入:

而後輸入你剛纔建立的管理員帳號和密碼,登陸管理界面,你會看到下面這樣的畫面:

1

【未完待續】

本文版權歸捨得學苑全部,歡迎轉載,轉載請註明做者和出處。謝謝!
做者:捨得
首發:捨得學苑@博客園

相關文章
相關標籤/搜索