先看整体效果:
(索要项目文件的,请评论中留下邮箱,我发给你)
项目结构:
准备工作 cmd命令输入
###在cmd命令中输入
adjango-admin startproject page_test2
###跳转到项目目录
cd page_test2
###新建app
python manage.py startapp front
settings.py注册app及templates路径标记
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'front']
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates/')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
项目中的urls.py整合app中的urls.py
from django.urls import path,include
urlpatterns = [
path('',include("front.urls")),
]
app中的urls.py内容
from django.urls import path
from front import views
app_name = 'front'
urlpatterns = [
path('bulk_add/',views.bulk_add,name='bulk_add'),
path('article_list/',views.ArticleList.as_view(),name='article_list')
]
models.py中新建模型 Article
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=20)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
views.py中对应函数及类
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import ListView
from front.models import Article
def bulk_add(request): #批量在数据库中生成article数据
articles = []
for x in range(102,150):
article = Article(title='test'+str(x),content='testingcontent'+str(x))
articles.append(article)
Article.objects.bulk_create(articles)
return HttpResponse('success!')
class ArticleList(ListView):
model = Article
template_name = 'article_list.html'
context_object_name = 'articles'
page_kwarg = 'p'
paginate_by = 10
ordering = 'create_time'
def get_context_data(self, *, object_list=None, **kwargs):
context =super(ArticleList,self).get_context_data(*kwargs)
context['username'] = 'testing'
tem = self.get_page_data(page_obj=context.get('page_obj'),paginator=context.get('paginator'))
context.update(tem)
print(context)
return context
def get_page_data(self,page_obj,paginator,space=2):
nums_pages = paginator.num_pages
current_page = page_obj.number
left_hasmore = False
right_hasmore = False
if current_page <=space+2:
left_range = range(1,current_page)
else:
left_hasmore = True
left_range = range(current_page-space,current_page)
if current_page >=nums_pages-space-1:
right_range = range(current_page+1,nums_pages+1)
else:
right_hasmore = True
right_range = range(current_page+1,current_page+space+1)
return {
'nums_pages':nums_pages,
'current_page':current_page,
'left_hasmore':left_hasmore,
'right_hasmore':right_hasmore,
'left_range':left_range,
'right_range':right_range
}
article_list.html内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<title>书单</title>
</head>
<body>
{% for article in articles %}
<ul>
<li>{{ article.title }}</li>
</ul>
{% endfor %}
<ul class="pagination">
{# 上一页#}
{% if page_obj.has_previous %}
<li><a href="{% url 'front:article_list' %}?p={{ page_obj.previous_page_number }}">上一页</a></li>
{% else %}
<li class="disabled"><a href="javascript:void(0);">上一页</a></li>
{% endif %}
{#中间页#}
{% if left_hasmore %}
<li><a href="{% url 'front:article_list' %}?p=1">1</a></li>
<li><a href="javascript:void(0);">...</a></li>
{% endif %}
{% for page in left_range %}
<li><a href="{% url 'front:article_list' %}?p={{ page }}">{{ page }}</a></li>
{% endfor %}
<li class="active"><a href="{% url 'front:article_list' %}?p={{ current_page }}">{{ current_page }}</a></li>
{% for page in right_range %}
<li><a href="{% url 'front:article_list' %}?p={{ page }}">{{ page }}</a></li>
{% endfor %}
{% if right_hasmore %}
<li><a href="javascript:void(0);">...</a></li>
<li><a href="{% url 'front:article_list' %}?p={{ nums_pages }}">{{ nums_pages }}</a></li>
{% endif %}
{#下一页#}
{% if page_obj.has_next %}
<li><a href="{% url 'front:article_list' %}?p={{ page_obj.next_page_number }}">下一页</a></li>
{% else %}
<li class="disabled"><a href="javascript:void(0);">下一页</a></li>
{% endif %}
</ul>
</body>
</html>
在批量插入数据之前,注意先建立映射:
##cmd命令中分别输入
python manage.py makemigrations
python manage.py migrate