服务端编程(十)- Django -创建网站页面

news/2024/5/20 13:54:57/文章来源:https://blog.csdn.net/weixin_43178828/article/details/104680492

文章目录

    • 前言 ´・ᴗ・`
    • Listview
    • ListView 的细节修改
    • 编辑每本书的详情页
    • detailView
    • 分页的编辑
    • 结语( ̄︶ ̄)↗

前言 ´・ᴗ・`

  • 上一节我们建立了主页 这里我们来创建一些别的网页 比如关于books author等等
  • 本篇内容将会帮助你学习…
    • 1 ListView的应用
    • 2 DetailView的应用

Listview

就是 “列表视图” 别被名字吓到了 这是最简单的视图构建“套路”
就是在指定的数据库(类)中取出所有数据 然后列表显示出来
比如像百度那种就是典型的
在这里插入图片描述
还记得上节 我们是编辑过view的
像这样从数据库取数据:

	num_books = Book.objects.all().count()num_instances = BookInstance.objects.all().count()num_instances_available = BookInstance.objects.filter(status__exact='a').count()num_authors = Author.objects.count()  # The 'all()' is implied by default.

然后 context打包 通过render送到template那边去填空:

context = {'num_books': num_books,'num_instances': num_instances,'num_instances_available': num_instances_available,'num_authors': num_authors,'num_visits': num_visits,}# Render the HTML template index.html with the data in the context variable.return render(request, 'index.html', context=context)

不过上次有点不同 需要统计数据(多少本书什么的) 用了count()
这里 我们更加傻瓜化——直接把数据库所有书倒出来 然后一列显示就ok了

django给我们封装了这种傻瓜化的view处理 就是Listview
而且用as_view() 函数来执行
具体操作很简单
1.catalog/view.py 添加:

from django.views import genericclass BookListView(generic.ListView):model = Book

BookListView 针对数据库Book模型的ListView

  1. 模板编辑:
    创建: /locallibrary/catalog/templates/catalog/book_list.html
{% extends "base_generic.html" %}{% block content %}<h1>Book List</h1>{% if book_list %}<ul>{% for book in book_list %}<li><a href="">{{ book.title }}</a> ({{book.author}})</li>{% endfor %}</ul>{% else %}<p>There are no books in the library.</p>{% endif %}       
{% endblock %}

当然 URL映射别忘了:

urlpatterns = [path('', views.index, name='index'),path('books/', views.BookListView.as_view(), name='books'),path('authors/', views.AuthorListView.as_view(), name='authors'),]

我们可以发现

  • 模板的名字 book_list.html
  • 模板变量 就是那个{% for book in book_list %} 引用的book_list 这个变量

奇怪不?我们从来没定义过 怎么就能用了呢?
这就是ListView帮我们干的事 当然也约定 模板名字与模板变量都采用model那个类的名字+list
class book ->book_list

ListView 的细节修改

事实上 是一个函数为get queryset 做了 从数据库拿数据到view的工作
因此 我们通过修改这个函数 自然也可以控制输出的结果
实现这点 ’

  • 可以从前端搞定 前端js当然可以限制 动态输出
  • 也可以后端限制 通过django支持的模板的一些分支语句(if else)
  • 还可以源头上 数据库调用的时候就减少数据传输
    这里更改get queryset算是第三种方式 举例:
class BookListView(generic.ListView):model = Bookpaginate_by = 4def get_queryset(self):return Book.objects.filter(title__icontains='ryan')[:5] # Get 5 books containing the title war

筛选所有title包含ryan的数据记录 然后返回给render

另外 paginate_by = 4 限制了一页中显示最大的记录条数
类似sql的LIMIT BY

然后这里我们就可以runserver一下啦:
在这里插入图片描述

编辑每本书的详情页

我们只是作了个书的清单 但是详情页还没弄
这里 先把book_list.html 修改一下

{% for book in book_list %}<li><a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})</li>{% endfor %}

主要是超链接的内容加上了

然后我们大胆的添加书本的详情页 url映射

urlpatterns = [path('', views.index, name='index'),path('books/', views.BookListView.as_view(), name='books'),path('authors/', views.AuthorListView.as_view(), name='authors'),path('book/<int:pk>', views.BookDetailView.as_view(), name='book-detail'),path('author/<int:pk>', views.AuthorDetailView.as_view(), name='author-detail'),]

author的套路相同 一并添加了:)
这里 <> 就类似正则表达式 捕获url地址中 author/ 后面所有的数字 并且存到pk这个变量里面

如果url捕获参数的模式(pattern) 很复杂 欢迎使用re_path() 函数代替path() 并且使用re正则表达式
这里限于篇幅不讲了 网上有关教程很多
我们应用repath 可以这么写:

re_path(r'^book/(?P<pk>\d+)$', views.BookDetailView.as_view(), name='book-detail'),

注意path()不采用·正则 其语法规则很简单 功能很弱
re_path()是完全用正则表达式的 功能无敌强

detailView

ListView特别适合 大致列个表 这种应用 目录菜单什么的
然而detailview提供一个适合“详情页”的布局视图

非常类似ListView 你只需在catalog/view.py 中添加:

class BookDetailView(generic.DetailView):model = Book

同样 book_detail 作为模板的文件名称:
不过模板变量变成model的类名 book
在catalog/templates/catalog/book_detail.html 填写:

{% extends "base_generic.html" %}{% block content %}<h1>Title: {{ book.title }}</h1><p><strong>Author:</strong> <a href="">{{ book.author }}</a></p> <!-- author detail link not yet defined --><p><strong>Summary:</strong> {{ book.summary }}</p><p><strong>ISBN:</strong> {{ book.isbn }}</p> <p><strong>Language:</strong> {{ book.language }}</p>  <p><strong>Genre:</strong> {% for genre in book.genre.all %} {{ genre }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>  <div style="margin-left:20px;margin-top:20px"><h4>Copies</h4>{% for copy in book.bookinstance_set.all %}<hr><p class="{% if copy.status == 'a' %}text-success{% elif copy.status == 'm' %}text-danger{% else %}text-warning{% endif %}">{{ copy.get_status_display }}</p>{% if copy.status != 'a' %}<p><strong>Due to be returned:</strong> {{copy.due_back}}</p>{% endif %}<p><strong>Imprint:</strong> {{copy.imprint}}</p><p class="text-muted"><strong>Id:</strong> {{copy.id}}</p>{% endfor %}</div>
{% endblock %}

注意“book.bookinstance_set”
首先 book 与 bookinstance 是外键 而且是一对多的
我们这里在book这端 用“一”引用多 就用了book.bookinstance_set 这是django给我们封装好的

分页的编辑

我们之前通过paginate_by = 10 进行分页 但这只是源头上限制了数据 但不能实现“前一页”“后一页”的按钮等
django封装了这个
由于我们几乎所有网页都这样式 我们直接在base_generic 更改:
打开 /locallibrary/catalog/templates/base_generic.html

{% block content %}{% endblock %}{% block pagination %}{% if is_paginated %}<div class="pagination"><span class="page-links">{% if page_obj.has_previous %}<a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">previous</a>{% endif %}<span class="page-current">Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>{% if page_obj.has_next %}<a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a>{% endif %}</span></div>{% endif %}
{% endblock %} 
  • page_obj 是一个 Paginator 对象,如果在当前页面上使用分页 如paginate_by = 10 ,它将启动
    这玩意允许您获取有关当前页面,之前页面,有多少页面等的所有信息。

  • {{ request.path }}可用来获取用于创建分页链接的当前页面URL

另外 我们顺便把author的也弄了:
模板 template/catalog/author_detail.html:

{% extends "base_generic.html" %}{% block content %}<h1> {{ author.first_name }}.{{author.last_name}}</h1><p><strong>living:</strong> {{ author.first_name }}.{{ author.last_name }} ({{ author.date_of_birth }}-{{ author.date_of_death }})</p><div style="margin-left:20px;margin-top:20px"><h4>What this poor bastard wrote:</h4><ul>
<!-- 这里反向查找 ‘多’引用‘一’ 而不像之前的 ‘一’引用‘多’ -->{% for copy in author.book_set.all %}<li><a href="">《{{copy.title}}》 ISBN:{{copy.isbn}}</a></li>{% endfor %}</ul></div>
{% endblock %}

模板 template/catalog/author_list.html:

{% extends "base_generic.html" %}{% block content %}<h1>Author List</h1>{% if author_list %}<ul>{% for author in author_list %}<li><a href="{{ author.get_absolute_url }}">{{ author.first_name }}.{{ author.last_name }}</a></li>{% endfor %}</ul>{% else %}<p>There are no one.</p>{% endif %}
{% endblock %}

catalog/view.py 添加

class AuthorListView(generic.ListView):model = Authorpaginate_by = 5class AuthorDetailView(generic.DetailView):model = Author

结语( ̄︶ ̄)↗

runserver检验战果
不出意外 你将收获:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里 基本上很多页面都能搞定了
下一站 我们会聊聊 会话
服务端编程(十一)- Django - session 认识会话 cookies

这是软菜鸡的其他系列学习文章 希望能够帮到你 ( •̀ ω •́ )✧

  • 想学习数据库嘛? 不妨从MySQL入手
    MySQL专栏

  • python这么火 想要深入学习python 玩一下简单的应用嘛?可以看我专栏 还在持续更新中哦:
    python应用

  • 这是本服务端编程专栏
    手把手带你学服务端

  • 谢谢大佬支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_858671.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站优化问题:雅虎网站优化35条

1. Make fewer HTTP requests 尽可能少的http请求。。我们有141个请求&#xff08;其中15个JS请求&#xff0c;3个CSS请求&#xff0c;47个CSS background images请求&#xff09;&#xff0c;多的可怕。思考了下&#xff0c;为什么把这个三种请求过多列为对页面加载的重要不利…

用phpstudy正确配置阿里服务器 网站就是不能浏览原因

用phpstudy 配置PHPMYSQL阿里云服务器&#xff0c; 所有配置都正确&#xff0c;服务器本地上也正常浏览&#xff0c; 但是用绑定服务器的域名打开浏览就是不行。 原因是阿里云服务器上的安全设置问题 阿里云服务器默认不能访问的&#xff0c;需要在阿里云服务器上增加安全规…

2017 年最受欢迎的 10个编程挑战网站

热文导读 | 点击标题阅读 如何看待中通讯42岁员工坠楼事件&#xff1f;背后深层原因剖析&#xff01; 吊炸天&#xff01;74款APP完整源码&#xff01; 成为 Android 大牛的10大独门秘籍 原文&#xff1a;The 10 most popular coding challenge websites for 2017 https://med…

IIS6、IIS7.5设置网站默认首页方法(Directory Listing Denied)

这篇文章主要介绍了IIS6、IIS7.5设置网站默认首页方法,如果不设置访问目录就会提示Directory Listing Denied&#xff0c;就是不允许列出文档&#xff0c;为了安全网站都会设置不设置默认,需要的朋友可以参考下 今天有个客户问我他的网址访问目录就打开网站出现Directory List…

如何使用站群程序来批量建网站?

本文转自&#xff1a;http://www.00-9.net/html/1.html 1、准备工作。 (1)准备好将要搭建的网站域名&#xff0c;并解析。 (2)准备好你的目标站。标题/关键词/描述/网站名&#xff0c;替换标签。 (3)服务器系统环境WIN2008 2、用到的工具&#xff1a; (1)009站群程序授权版&am…

网站发送邮件连接数据口创建接口等

1. 导入API.php文件&#xff08;可以参考demo项目中的api.php文件&#xff09; <?php defined(BASEPATH) OR exit(No direct script access allowed); header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Headers: Origin, X-Reques…

在进网站之前加入一个类似开机视频的东西,视频播放完后自动跳到网站首页

首先建一个文件&#xff0c;里面放要加载的视频 <style></style> <script src"https://cdn.jsdelivr.net/npm/vue2.5.16/dist/vue.js"></script> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-ch…

常用各类工具网站

常用的各类网站&#xff1a; 1.自己备用&#xff0c;分享链接&#xff0c;也可供各位网友选择&#xff0c;若有侵权&#xff0c;可联系删除 2.会不定时更新 3.加油&#xff01;奥里给&#xff01; PPT&#xff1a; 1、 PPT超级市场 https://ppt.sotary.com/web/wxapp/index…

最好的UI/UE设计资源网站推荐-免费的头像库

在进行UI/UE设计时&#xff0c;一旦涉及到社交相关的功能&#xff0c;会经常需要使用到头像素材。而高质量、无版权要求的相关素材又非常少&#xff0c;这里为大家推荐一个素材库可以满足上述要求。 网址 FIGMA 和 SKETCH 的免费头像库 https://themeselection.com/products/e…

大型Web网站高并发架构方案

背景 搭建一套大型WEB网站从技术角度讲采用开源的成熟的方案落地实现起来很简单&#xff0c;但是怎么扛住高并发的流量呢&#xff1f;这是一个值得我们思考的问题&#xff0c;值得我们一探究竟如何优化既有架构从而实现高并发的访问&#xff0c;使系统优雅平稳的运行 现有架构…

用asyncio和aiohttp异步协程爬取披露易网站港资持股数据

这是本人毕设项目的一部分&#xff0c;也是比较核心的部分。 请自觉遵守相关法律法规&#xff0c;若侵权请联系本人立刻删除。 任务描述 爬取披露易网站上的港资持股A股详细股东数据。点击搜索栏下方的持股名单我们可以看到港资持股的股份名单。 任务分为三部分&#xff1a; …

基于GitHub搭建个人网站

基于GitHub搭建个人网站 基于GitHub搭建个人网站 我的个人站点 https://github.com/wforguo 当你撸完一份自己的个人网站&#xff0c;然后想让别人去访问它&#xff0c; 怎么办&#xff1f;去买个服务器&#xff0c;也太贵了吧&#xff01; 下面&#xff0c;利用GitHub来教你…

毕业设计——基于HTML5的洛阳旅游网站设计与实现

基于HTML5的旅游网站设计与实现 这是一个基于HTML5的旅游网站&#xff0c;论文、代码都很齐全。 获取源代码至GitHub&#xff1a;GitHub - wforguo/travel: 基于HTML5的旅游网 国内站点&#xff1a;travel: 毕业设计&#xff0c;课程设计&#xff0c;基于HTML5的洛阳旅游网开…

修改hosts不管用 为什么修改127 0 0 1指向的域名,访问域名却弹出别的网站

linux上的hosts&#xff1a; 一般在LINUX下修改完/etc/hosts文件都会立即生效的&#xff0c;即便偶尔不生效&#xff0c;只要重启一下network服务就可以了。 win上的hosts&#xff1a; 但是windows却是会遇到这样的问题&#xff0c;而且在不同版本的系统中还略有区别。 原理&am…

数据分析入门——推荐基础书以及实用网站

数据分析入门&#xff1a; 一开始肯定是数学基础巩固&#xff1a; 线性代数、统计论等。参考书成千上百&#xff0c;最重要还是理解透&#xff01; 二就是各种软件的熟悉利用&#xff1a;EXCEL SPSS SAS 等&#xff0c;这是我桌面常用到的软件&#xff1a; 三便是进阶版&#x…

GitHub网站的主题设置

文章目录 设置GitHub主题固定主题随时间自动改变主题 今天访问GitHub时&#xff0c;发现个人中心有一个新的功能点appearance。进一步发现此功能是设置GitHub的个人主题设置&#xff0c;主题有三个&#xff0c;分别为 Default light 、Default dark 、Dark dimmed 设置GitHub主…

大型网站技术架构-核心原理与案例分析

D:\和动力\大型网站技术架构-核心原理与案例分析.xmind 如果你觉得我的文章帮助到了你并节省了开发时间&#xff0c;请扫描下方二维码随意打赏❥(^_^) 您的支持是我最大的鼓励

搭建个人网站vm+center os+apache

如何搭建个人网站 准备的前提 vmcnetos 7apche 在vm上安装center os的教程就不介绍了这个有很多 1.如何配置一台刚装好了center os 7并且能够使他联网 ping 通百度 ip a查看当前ip地址&#xff08;如果显示当前界面&#xff0c;说明没有配置ip地址,网卡没有开启&#xff0…

用jQuery构建网站

主页面 常见的头尾自适应两列布局、第二列又分为上下两部分 实现的主要功能有 网站换肤功能 二级菜单功能图片轮播功能选项卡功能自定义的提示框功能品牌活动图上悬浮放大镜的功能 详情页面 和主页面布局差不多&#xff0c;也是头尾两列自适应布局 实现的功能&#xff1a…

企业如何营销才能体现你网站的价值

根据有关机构数据统计分析&#xff0c;截止2016年我国中小企业数量已经达到50000万左右。中国众多中小型企业已加入网络营销的行列&#xff0c;网络营销也为众多企业带来了巨大的利润。但是却有近乎3分之一的企业自己的网站竟然没有盈利或者说盈利很少&#xff0c;更别说通过互…