Python 2.7.13
Django==1.19.5
后一篇:Django 的圖片上傳與顯示 2: ImageFiled 方法
Django 處理圖片的上傳與顯示孵稽,主要使用 models 的兩種 Field 來處理圖片:
- FieldField:優(yōu)點(diǎn)是簡單、不依賴第三方庫;缺點(diǎn)是缺少對(duì)圖片的復(fù)雜處理功能谜悟。
- ImageField:優(yōu)點(diǎn)是可以對(duì)圖片進(jìn)行更多處理澎胡,比如可以獲得圖片的寬和高的像素大小眷蜈、可以縮小圖片等;缺點(diǎn)是需要依賴第三方庫 pillow带饱。
具體關(guān)于 FileField 和 ImageField 說明,也可以查看官方文檔 FileField.
storage阅羹。
0 前置條件
需要設(shè)置好靜態(tài)文件配置參數(shù)勺疼,參照
Django 開發(fā)時(shí)的靜態(tài)文件配置參數(shù)以及 collectstatic
1 FileField 方法
1.1 設(shè)置 models 中的屬性
在 posts/models.py 中設(shè)置 FileField,屬性要運(yùn)行為空和 null捏鱼。因?yàn)榭赡懿簧蟼鲌D片执庐。
class Post(models.Model):
image = models.FileField(null=True, blank=True)
設(shè)置好之后需要數(shù)據(jù)遷移
$ python manage.py makemigrations
$ python manage.py migrate
在 posts/admin.py 中把 models 的 Post 這個(gè)類(數(shù)據(jù)表)注冊(cè)進(jìn)去。
from django.contrib import admin
from .models import Post
admin.site.register(Post)
開啟服務(wù)器
$ python manage.py runserver 0.0.0.0:8080
進(jìn)入后臺(tái) admin导梆,在瀏覽器輸入 127.0.0.1:8080/admin
轨淌,新建或者增加 post,可以看圖片可以上傳了看尼。
圖片上傳以后递鹉,會(huì)直接保存在之前在參數(shù)設(shè)定中,用 MEDIA_ROOT 設(shè)置好的目錄狡忙,名叫 media_cdn
梳虽。
1.2 forms 和 views
如果使用 form 表單驗(yàn)證,forms.py 的設(shè)置如下
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = [
"image",
]
而對(duì)于 views 函數(shù)灾茁,如果是創(chuàng)建一個(gè)空的 form 用于提交窜觉。這里使用了 forms 表單驗(yàn)證,參數(shù)需要加入 request.FILES or None
北专,否則會(huì)報(bào)錯(cuò)禀挫。
from django.shortcuts import redirect
from .models import Post
def post_create(request):
form = PostForm(request.POST or None, request.FILES or None)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return redirect(reverse("detail", kwargs={"id": instance.id}))
context = {
"form": form,
}
return render(request, "post_form.html", context)
def post_detail(request, id=None):
instance = get_object_or_404(Post, id=id)
context = {
"instance": instance,
}
return render(request, "post_detail.html", context)
對(duì)于路由而言,create 是創(chuàng)建表單拓颓,帶變量 id 則是獲得該 id 的詳情语婴。
from django.conf.urls import url
urlpatterns = [
url(r'^create/$', "posts.views.post_create"),
url(r'^(?P<id>\d+)/$',"posts.views.post_detail", name='detail'),
# ...
]
1.3 Django 模板中的使用
form 提交
對(duì)于 form 的文件上傳,一定要在 form 標(biāo)簽中使用 enctype='multipart/form-data'
屬性驶睦,完整的屬性設(shè)置如下:
templates/post_form.html
<form methdo='POST' action='' enctype='multipart/form-data'>
{{ form.as_p }}
<input type="submit" value="create post" name="">
{% csrf_token %}
</form>
其中 action=''
表示提交到當(dāng)前頁面砰左。
圖片顯示
templates/post_detail.html
{% if instance.image %}

{% endif %}
代碼用圖片顯示為:
需要對(duì)傳過來的表單數(shù)據(jù) instance進(jìn)行判斷,存在圖片再顯示场航。