django 上傳圖片和文件並在頁面展示


在django中創建一個用戶的模型:

class User(models.Model):
    name = models.CharField(max_length=256)
    image = models.ImageField(upload_to='images/')
    introduce = models.FileField(upload_to='introduce/')

    def __str__(self):
        return self.name

模型建好后,執行以下命令在數據庫中建表

# 遷移
python manage.py makemigrations
#使模型作用於數據庫
python manage.py migrate

在項目根目錄下創建一個media文件,用來保存上傳的圖片和文件

修改settings.py文件,添加如下兩行

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

寫一個添加用戶的頁面模板add.html

<h1>添加用戶</h1>
<form action="/uploads/add/" enctype="multipart/form-data" method="post">
     {% csrf_token %}
    <label for="username">用戶名:</label>
    <input type="text" name="username" id="username"/><br/>
    <label for="img">頭像:</label>
    <input type="file" name="img" id="img"/><br/>
    <label for="introduce">簡介:</label>
    <input type="file" name="introduce" id="introduce"/><br/>
    <button>提交</button>
</form>

在視圖文件views.py中添加如下視圖函數:

def add(request):
    if request.method == 'POST':
        name = request.POST.get('username')
        img = request.FILES.get('img')
        introduce = request.FILES.get('introduce')
        user = User(name=name, image=img, introduce=introduce)
        user.save()
        return render(request, 'uploads/add.html', locals())
    return render(request, 'uploads/add.html', locals())

到這里就可以正常上傳圖片和文件了。

下面就是怎么在頁面上展示上傳的圖片和文件內容了。

修改一級路由urls.py,添加如下內容

from django.contrib import admin
from django.urls import path
from django.urls import include
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
                  path('admin/', admin.site.urls),
                  path('polls/', include('polls.urls')),
                  path('uploads/', include('uploads.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Django中,如果要在頁面加載靜態文件,那么必須要在路由中增加static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT),其中MEDIA_URL和MEDIA_ROOT就在我們先前在settings中添加的。

在視圖views.py中新增如下視圖函數

def detail(request):
    user_list = User.objects.all()
    return render(request, 'uploads/detail.html', locals())

新加一個detail.html的模板頁面

{% for user in user_list %}
    <h1>{{ user.name }}</h1>
    <img src="{{ user.image.url }}" />
    {% for line in user.introduce.readlines %}
        <p>{{ line.decode }}</p>
    {% endfor %}
{% endfor %}

這里注意模板文件中的這幾點:

1、user.image獲取的是數據庫中保存的圖片路徑,也就是image字段,是一個字符串,如images/02.png,user.image.url就能獲取圖片在系統中的實際保存路徑,類似的用法還有user.image.name:獲取圖片的名稱,user.image.size:獲取薄片的大小(字節數)

2、user.introduce獲取的也只是數據庫中introduce字段值,是文件的路徑,user.introduce.readlines就能打開這個文件並能讀取所有行,注意這里讀取是b模式(二進制)讀取的

3、line.decode就是將二進制轉成字符串

 


免責聲明!

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



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