day47-Django表單驗證圖片上傳和分頁技術(shù)

一、表單驗證

1.定義驗證表單

from django import forms


class AddArtForm(forms.Form):
    # required = True 表示必填項
    # min_length 表示最小長度
    title = forms.CharField(min_length=5, required=True)
    desc = forms.CharField(min_length=20, required=True)
    content = forms.CharField(required=True)

2.使用表單驗證
is_valid():驗證參數(shù)是否有效熄守,如果參數(shù)驗證成功返回True励幼,否則返回False
from.errors:返回錯誤信息

from article.Artform import AddArtForm


def add_art(request):
    if request.method == 'GET':
        return render(request, 'add_article.html')

    if request.method == 'POST':
        # 把提交的數(shù)據(jù)交給表單AddArtForm做驗證
        form = AddArtForm(request.POST)

        if form.is_valid():
            title = form.cleaned_data['title']
            desc = form.cleaned_data['desc']
            content = form.cleaned_data['content']
            Article.objects.create(title=title, desc=desc, content=content)

            # 創(chuàng)建文章成功后慷荔,返回文章列表頁面
            return HttpResponseRedirect(reverse('art:art_list'))
        else:
            # 表示字段驗證失敗雕什,需要將錯誤信息返回給頁面展示
            return render(request, 'add_article.html', {'form': form})

3.反向解析
(1)修改urls.py配置文件

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^article/', include('article.urls', namespace='art'))
]

(2)修改article.urls.py配置文件

from django.conf.urls import url

from article import views

urlpatterns = [
    # 創(chuàng)建文章
    url(r'^add_art/', views.add_art, name='add'),
    # 文章列表
    url(r'^art/', views.art, name='art_list'),
]

(3)url反向解析

from django.urls import reverse


def add_art(request):
    if request.method == 'GET':
        return render(request, 'add_article.html')

    if request.method == 'POST':
        form = AddArtForm(request.POST)

        if form.is_valid():
            title = form.cleaned_data['title']
            desc = form.cleaned_data['desc']
            content = form.cleaned_data['content']
            Article.objects.create(title=title, desc=desc, content=content)
            # url反向解析
            return HttpResponseRedirect(reverse('art:art_list'))
        else:
            return render(request, 'add_article.html', {'form': form})

二、分頁技術(shù)

1.Paginator分頁技術(shù)

# 1.使用Paginator分頁
p = Paginator(需要分頁的總數(shù)據(jù)显晶,一頁的條數(shù))

# 2.獲取指定頁碼
page = p.page(獲取哪一頁的頁碼)

# 3.獲取當(dāng)前頁
page.number

# 4.獲取當(dāng)前有多少頁
page.p.num_pages

# 5.獲取一共多少條數(shù)據(jù)
page.p.count

# 6.獲取頁碼范圍
page.p.page_range

# 7.是否存在上一頁
page.has_previous

# 8.是否存在下一頁
page.has_next

# 9.獲取上一頁頁碼
page.previous_page_number

# 10.獲取下一頁頁碼
page.next_page_number

2.使用Paginator進(jìn)行分頁

from django.core.paginator import Paginator


def art(request):
    if request.method == 'GET':
        # 文章列表頁面
        page_num = int(request.GET.get('page', 1))

        # 使用Paginator進(jìn)行分頁
        articles = Article.objects.all()
        # 將所有數(shù)據(jù)按照每一頁2條數(shù)據(jù)進(jìn)行切塊處理
        paginator = Paginator(articles, 2)
        # 獲取分頁中的第幾頁數(shù)據(jù)
        page = paginator.page(page_num)

        return render(request, 'art.html', {'page': page})

3.使用切片進(jìn)行分頁

def art(request):
    if request.method == 'GET':
        # 文章列表頁面
        page_num = int(request.GET.get('page', 1))
        # 使用切片完成分頁
        articles = Article.objects.all()[(page-1)*2: page*2]

        return render(request, 'art.html', {'page': page})

三贷岸、圖片上傳

1.表單上傳圖片
注意:表單中必須有enctype="multipart/form-data"

<form action="" method="post" enctype="multipart/form-data">
        <p>圖片:<input type="file" name="icon"></p>
        <input type="submit" value="提交">
</form>

2.修改setting.py配置文件
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# 媒體文件media配置
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

3.在工程目錄的urls.py文件中配置解析media的路由

from django.contrib.staticfiles.urls import static
from day07.settings import MEDIA_URL, MEDIA_ROOT

# 告訴Django,解析media文件夾中的靜態(tài)文件
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)

4.模型中定義保存圖片的字段
models.ImageFiled(upload_to='article')

from django.db import models


class Article(models.Model):
    title = models.CharField(max_length=100)
    desc = models.CharField(max_length=150)
    content = models.TextField()
    icon = models.ImageField(upload_to='article', null=True)
    create_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'article'

5.定義視圖函數(shù)
獲取圖片:request.FILES

def add_art(request):
    if request.method == 'GET':
        return render(request, 'add_article.html')

    if request.method == 'POST':
        form = AddArtForm(request.POST, request.FILES)

        if form.is_valid():
            title = form.cleaned_data['title']
            desc = form.cleaned_data['desc']
            content = form.cleaned_data['content']
            icon = form.cleaned_data['icon']
            Article.objects.create(title=title, desc=desc, content=content, icon=icon)
            return HttpResponseRedirect(reverse('art:art_list'))
        else:
            return render(request, 'add_article.html', {'form': form})

6.頁面解析圖片
頁面解析圖片<img src = "/media/{{ 圖片對象.icon }}">

{% for art in page %}
    <tr>
        <td>{{ art.id }}</td>
        <td>{{ art.title }}</td>
        <td>{{ art.desc }}</td>
        <td>{{ art.content }}</td>
        <td><img src="/media/{{ art.icon }}" width=100px; height=100px></td>
    </tr>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吧碾,一起剝皮案震驚了整個濱河市凰盔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倦春,老刑警劉巖户敬,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異睁本,居然都是意外死亡尿庐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門呢堰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抄瑟,“玉大人,你說我怎么就攤上這事枉疼∑ぜ伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵骂维,是天一觀的道長惹资。 經(jīng)常有香客問我,道長航闺,這世上最難降的妖魔是什么褪测? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮潦刃,結(jié)果婚禮上侮措,老公的妹妹穿的比我還像新娘。我一直安慰自己乖杠,他們只是感情好分扎,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胧洒,像睡著了一般畏吓。 火紅的嫁衣襯著肌膚如雪环揽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天庵佣,我揣著相機(jī)與錄音,去河邊找鬼汛兜。 笑死巴粪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥谬。 我是一名探鬼主播肛根,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漏策!你這毒婦竟也來了派哲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤掺喻,失蹤者是張志新(化名)和其女友劉穎芭届,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體感耙,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡褂乍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了即硼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖只酥,靈堂內(nèi)的尸體忽然破棺而出褥实,到底是詐尸還是另有隱情,我是刑警寧澤裂允,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布损离,位于F島的核電站,受9級特大地震影響叫胖,放射性物質(zhì)發(fā)生泄漏草冈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一瓮增、第九天 我趴在偏房一處隱蔽的房頂上張望怎棱。 院中可真熱鬧,春花似錦绷跑、人聲如沸拳恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谬运。三九已至隙赁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梆暖,已是汗流浹背伞访。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留轰驳,地道東北人厚掷。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像级解,于是被迫代替她去往敵國和親冒黑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容