一、表單驗證
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>