在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就是將二進制轉成字符串