Django 圖片上傳到數據庫 並調用顯示


環境: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字典的方式去獲取文件,然后創建新的數據,並保存到數據庫中。

    


 

   

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM