1. 程式人生 > >第三百八十七節,Django+Xadmin打造上線標準的在線教育平臺—網站上傳資源的配置與顯示

第三百八十七節,Django+Xadmin打造上線標準的在線教育平臺—網站上傳資源的配置與顯示

req model online super ddr import bsp class ews

第三百八十七節,Django+Xadmin打造上線標準的在線教育平臺—網站上傳資源的配置與顯示

首先了解一下static靜態文件與上傳資源的區別,static靜態文件裏面一般防止的我們網站樣式的文件,包括ccs,js,網站樣式圖片

上傳資源是用戶操作上傳的圖片等資源

上傳資源的配置

1,首先在項目裏創建一個名稱叫media的文件夾專門保存用戶上傳

2,settings.py文件配置上傳資源的路徑

# 上傳資源路徑,如果圖片,上傳文件等
MEDIA_URL = /media/                           # 設置上傳資源前綴名稱
MEDIA_ROOT = os.path.join(BASE_DIR, 
media) # 設置上傳文件路徑

這樣配置好後,當用戶上傳文件時,會根據數據表類的上傳字段設置來,將文件上傳到,media文件夾裏,如下

數據表類

class CourseOrg(models.Model):
    name = models.CharField(max_length=50, verbose_name=機構名稱)
    desc = models.TextField(verbose_name=機構描述)
    category = models.CharField(max_length=20, verbose_name=機構類別, default=
pxjg, choices=((pxjg, 培訓機構), (gx, 高校), (gr, 個人))) click = models.IntegerField(default=0, verbose_name=點擊數) fav_nums = models.IntegerField(default=0, verbose_name=收藏數) image = models.ImageField(upload_to=org/%Y/%m, verbose_name=封面圖, max_length=100) address = models.CharField(max_length=150, verbose_name=
機構地址) city = models.ForeignKey(CityDict, verbose_name=外鍵城市表) add_time = models.DateTimeField(default=datetime.now, verbose_name=添加日期) class Meta: verbose_name = 課程機構表 verbose_name_plural = verbose_name def __str__(self): return self.name

技術分享

此時可以看到上傳文件安裝年月來保存文件,那麽怎麽設置文件名

設置上傳文件名稱

1、先在你項目中添加一個文件夾如:system 在文件夾下添加__init__.pystorage.py文件,並在storage.py中添加如下代碼:

# -*- coding: UTF-8 -*-
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponse
class ImageStorage(FileSystemStorage): from django.conf import settings def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL): # 初始化 super(ImageStorage, self).__init__(location, base_url) # 重寫 _save方法 def _save(self, name, content): #name為上傳文件名稱 import os, time, random # 文件擴展名 ext = os.path.splitext(name)[1] # 文件目錄 d = os.path.dirname(name) # 定義文件名,年月日時分秒隨機數 fn = time.strftime(%Y%m%d%H%M%S) fn = fn + _%d % random.randint(0,100) # 重寫合成文件名 name = os.path.join(d, fn + ext) # 調用父類方法 return super(ImageStorage, self)._save(name, content)

2、在models.py文件中添加如下代碼:

在數據庫文件導入我們設置的類

在上傳字段裏設置storage=ImageStorage()執行類,就是我們自定義storage.py中的類

from system.storage import ImageStorage
pic=models.ImageField(upload_to=img/%Y/%m/%d,storage=ImageStorage())  #如果上傳文件可以將ImageField換為FileField

上傳文件顯示

上傳的文件如圖片,要在前臺或者後臺顯示,就需要配置才能顯示

要給上傳文件訪問配置一個專門的url路由映射

from django.conf.urls import url, include                   # 導入django自在的include邏輯
from django.contrib import admin
from django.views.generic import TemplateView               # 導入django自帶的TemplateView邏輯
from django.views.static import serve                       # 導入django自帶的serve靜態資源邏輯
import xadmin                                               # 導入xadmin

from app_users.views import deng_lu, zhu_ce, active_code, logout                 # 導入登錄邏輯處理類
from app_organization.views import org_list                                      # 導入授課機構邏輯
from MxOnline.settings import MEDIA_ROOT


urlpatterns = [
    url(r^xadmin/, xadmin.site.urls),

    url(r^index.html, TemplateView.as_view(template_name=index.html), name=index),

    # 註冊
    url(r^register.html, zhu_ce.as_view(), name=register),
    url(r^captcha/, include(captcha.urls), name=captcha),
    url(r^active/(?P<active_de>.*)/$, active_code.as_view(), name="user_active"),

    # 登錄
    url(r^login.html, TemplateView.as_view(template_name=login.html), name=login),
    url(r^deng_lu, deng_lu.as_view(), name=deng_lu),
    url(r^logout, logout.as_view(), name=deng_lu),

    # 授課機構
    url(r^org_list.html, org_list.as_view(), name=org_list),

    # 專門處理靜態資源請求映射,也就是media上傳文件夾裏的請求映射
    url(rmedia/(?P<path>.*)$, serve, {document_root: MEDIA_ROOT})  # MEDIA_ROOT為配置上傳文件的路徑變量
]

此時後臺可以顯示圖片了

前臺顯示可以通過settings.py配置的上傳資源前綴名稱來拼接路徑顯示

HTML文件

                                <a href="org-detail-homepage.html">
                                    <img width="200" height="120" class="scrollLoading"
                                         data-url="{{ MEDIA_URL }}{{ ji.image }}"/>         {# 需要拼接靜態資源路徑 #}
                                </a>

註意:如果在html文件要獲取到settings.py配置的MEDIA_URL,需要在配置文件設置一個靜態資源處理類

TEMPLATES = [
    {
        BACKEND: django.template.backends.django.DjangoTemplates,
        DIRS: [os.path.join(BASE_DIR, templates)],                      # 配置模板文件路徑,也就是html路徑
        APP_DIRS: True,
        OPTIONS: {
            context_processors: [
                django.template.context_processors.debug,
                django.template.context_processors.request,
                django.contrib.auth.context_processors.auth,
                django.contrib.messages.context_processors.messages,
                django.template.context_processors.media,                 # 配置html頁面獲取MEDIA_URL路徑
            ],
        },
    },
]

第三百八十七節,Django+Xadmin打造上線標準的在線教育平臺—網站上傳資源的配置與顯示