環境:Django2.0 Python3.6.4
建立項目,數據庫設置,就不說了。
直接上代碼:
在models.py中,需要建立模型,這里使用了ImageField字段,用來存儲圖片路徑,這個字段繼承了FileField字段,本質上是一樣的。這里Image.Field的默認max_length=100,我們可以根據需求自己指定。upload_to用於指定上傳到哪個路徑下。
PS: 使用ImageField首先需要裝Pillow。
1 pip install Pillow
1 class Test(models.Model): 2 name = models.CharField(max_length=50) 3 image = models.ImageField(upload_to='logo') 4 def __str__(self): 5 return self.name
建立好模型,需要進行遷移操作,
1 python manage.py makemigrations 2 python manage.py migrate
在settings.py中,設置MEDIA_URL和MEDIA_ROOT
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
我們需要告訴Django,媒體文件的位置在哪里。這樣就和數據庫存儲的路徑相對應了,具體就是MEDIA_ROOT指定目錄,upload_to就是在這個目錄下進行操作。
1. 顯示圖片(圖片調用)
為了能夠方便錄入數據,我們使用django后台管理,創建管理頁面。
python manage.py createsuperuser
根據提示進行創建。在app下admin.py中將需要上面創建的模型進行添加。
admin.site.register(Test)
開啟runserver,打開admin頁面,就可以創建具體的數據了,將圖片進行添加。
我們需要調用的話,需要在view.py中將數據進行傳遞。
img = Test.objects.all() return render(request, 'home.html', {'img':img})
在視圖函數中加入,上面兩句。在模板中,將圖片展現出來:
{% for i in img %} <img src="{{ MEDIA_URL }}{{ i.image }}"> {% endfor %}
這里{{ MEDIA_URL }}是必須要的,因為數據庫取出來的地址是/logo/img001.png這種,路徑不完整,我們存儲的路徑上/media/logo/img001.png
但到這里還是不能正常顯示圖片,會顯示404,是因為圖片的url也是需要通過django進行指派,我們還需要在urls.py進行設定。
為了html模板能正確找到MEDIA_URL,TEMPLATES中導入相關的包。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , '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',#### add here ], }, }, ]
直接參考官方文檔即可。這樣圖片的url才是完整的,我們的頁面才可以正常顯示圖片。
2. 上傳圖片
我們可能需要用戶上傳自己的頭像,或者相冊,這里做一個簡單的示范:
首先需要一個form,enctype="multipart/form-data" method="post" 是必須要填寫的,表示數據不經過編碼,直接上傳。{%csrf_token%}也是post時,django強制要求的。
<form enctype="multipart/form-data" action="#" method="post"> {% csrf_token %} <input type="text" name="name"> <input type="file" name="logo"> <input type="submit" value="upload"> </form>
然后需要去views.py對視圖函數進行操作。
if request.method == 'POST': file = request.FILES['logo'] if file: new_img = Test( name=request.POST.get('name'), image=file ) new_img.save()
與普通的數據不同,這里使用了request.FILES字典的方式去獲取文件,然后創建新的數據,並保存到數據庫中。