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

一、表單驗(yàn)證

1.定義驗(yàn)證表單

from django import forms


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

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

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做驗(yàn)證
        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:
            # 表示字段驗(yàn)證失敗,需要將錯(cuò)誤信息返回給頁面展示
            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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 切換到創(chuàng)建項(xiàng)目的目錄 cd C:\Users\admin\Desktop\DjangoProject創(chuàng)建名為pr...
    在努力中閱讀 3,525評論 2 3
  • 一、Django框架前言知識(shí): 1、C/S和B/S的區(qū)別: C/S結(jié)構(gòu)軟件:客戶端/服務(wù)端軟件,即客戶端要自己下載...
    月下獨(dú)酌123閱讀 5,110評論 0 36
  • 表單驗(yàn)證 邏輯處理,創(chuàng)建表單驗(yàn)證模塊里的驗(yàn)證類,并將用戶請求的POST對象,傳入驗(yàn)證類進(jìn)行驗(yàn)證,驗(yàn)證后獲取驗(yàn)證通過...
    莫名ypc閱讀 637評論 0 0
  • 模塊間聯(lián)系越多,其耦合性越強(qiáng),同時(shí)表明其獨(dú)立性越差( 降低耦合性,可以提高其獨(dú)立性)。軟件設(shè)計(jì)中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,203評論 0 8
  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,172評論 3 119

友情鏈接更多精彩內(nèi)容