Anaconda+django写出第一个web app(十)
今天继续学习外键的使用。
当我们有了category、series和很多tutorials时,我们查看某个tutorial,可能需要这样的路径http://127.0.0.1:8000/category/series/tutorial,这样看上去十分的繁琐,我们希望无论是在category下还是在series、tutorials下,都只有一级路径。
那么如何做呢?首先在views.py中,我们定义一个single_slug函数:
def single_slug(request, single_slug):
categories = [c.category_slug for c in TutorialCategory.objects.all()]
if single_slug in categories:
matching_series = TutorialSeries.objects.filter(tutorial_category__category_slug=single_slug)
series_urls = {} for m in matching_series.all():
part_one = Tutorial.objects.filter(tutorial_series__tutorial_series=m.tutorial_series).earliest('tutorial_published')
series_urls[m] = part_one.tutorial_slug return render(request=request,
template_name='main/category.html',
context={'tutorial_series':matching_series, 'part_ones': series_urls}) tutorials = [t.tutorial_slug for t in Tutorial.objects.all()]
if single_slug in tutorials:
return HttpResponse(f"{single_slug} is a tutorial.")
这里我们还定义了一个字典series_urls,字典的键为series,字典的值为该series下的第一个tutorial(也就是发布时间最早的tutorial)。然后我们指向了一个新的网页category.html,内容如下:
{% extends 'main/header.html' %}
{% block content %}
<div class="row">
{% for t, partone in part_ones.items %}
<div class="col s12 m6 l4">
<a href="{{partone}}" style="color:#000">
<div class="card hoverable">
<div class="card-content">
<div class="card-title blue-text"><strong>{{ t.tutorial_series }}</strong></div>
<p>{{ t.series_summary }}</p>
</div>
</div>
</a>
</div>
{% endfor %}
</div>
{% endblock %}
我们显示了这个该category下的某个series的标题和摘要。
为了能够访问这个html,我们还需要定义main文件夹下的urls.py,来指向这个路径:
from django.urls import path
from . import views app_name = 'main' #此处为了urls的命名空间 urlpatterns = [
path('', views.homepage, name='homepage'),
path('register/', views.register, name='register'),
path('logout/', views.logout_request, name='logout_request'),
path('login/', views.login_request, name='login_request'),
path('<single_slug>', views.single_slug, name='single_slug'),
]
我们可以在admin下自己先定义几个category和几个series,我定义了两个category,分别为Web Development和Data Analysis,定义了两个Series,分别为Django和Machine Learning,然后到浏览器http://127.0.0.1:8000/,刷新页面:

随便点击某一个卡片,我这里点击第一个Web Development,看到如下界面:

继续点击,我们看到路径仍然只有一级:

下一节,我们需要继续定义tutorial这个路径下显示的内容,也就是第一个tutorial以及一个滑动条来显示所有的tutorials,而不是只显示这么一行字。
参考链接:
[1] https://pythonprogramming.net/working-foreign-keys-django-tutorial/
Anaconda+django写出第一个web app(十)的更多相关文章
- Anaconda+django写出第一个web app(一)
在安装好Anaconda和django之后,我们就可以开始创建自己的第一个Web app,那么首先创建一个空文件夹,之后创建的文件都在这个文件夹内. 启动命令行进入此文件夹内,可以先通过如下命令查看一 ...
- Anaconda+django写出第一个web app(十一)
今天我们来学习给页面添加一个Sidebar,根据Sidebar跳转到相应的tutorial. 打开views.py,编辑single_slug函数: def single_slug(request, ...
- Anaconda+django写出第一个web app(九)
今天来学习外键的使用,用外键来连接数据库中的两个表. 当我们的tutorials非常多的时候,目前的显示方式就会使得页面非常凌乱.我们可以考虑把这些教程分为不同的系列,页面只显示标题以及概要等信息,进 ...
- Anaconda+django写出第一个web app(三)
前面我们已经建立了模型Tutorial,也已经可以用Navicat Premium打开数据看查看数据,接下来我们通过建立admin账户来上传数据. 在命令行执行如下命令来创建用户: python ma ...
- Anaconda+django写出第一个web app(二)
今天开始建立App中的第一个Model,命名为Tutorial. Model的定义在main文件夹下的models.py中通过类进行,我们希望Tutorial这个model包含三个属性:标题.内容和发 ...
- Anaconda+django写出第一个web app(七)
今天来实现如何在页面弹出一些信息,比如注册成功后弹出注册成功的信息.这一点可以通过materialize里的Toasts来实现. django自带的messages可以告诉我们是否注册成功,以及注册失 ...
- Anaconda+django写出第一个web app(六)
今天学习如何写一个注册用户的界面. 上一节的导航栏中我们修改了导航栏右侧的文字为register并将路径设置为/register,内容如下: <li><a href="/r ...
- Anaconda+django写出第一个web app(四)
前面对Models有了一些了解,今天开始进一步了解Views,了解Views如何和Models交互以及了解模板(templates). 打开main文件夹下的views.py,重新编写homepage ...
- Anaconda+django写出第一个web app(八)
今天来实现网站的登入和登出功能. 首先我们需要在urls.py中添加路径,注意此处的路径和在导航栏中设置的文字路径保持一致: from django.urls import path from . i ...
随机推荐
- 智能合约bug以及修改方案
截取两篇文章:第一遍文章说的是智能合约能不能修改的问题: ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来? 第0章 引言 如果ETC充值到了ETH地址上,能找回来吗?答案是不一定. ET ...
- 一篇带你读懂TCP之“滑动窗口”协议
前言 你现在的努力,是为了以后有更多的选择. 在上一篇文章通过"表白"方式,让我们快速了解网络七层协议了解了网络七层协议. 接下来我们要把重心放在网络传输的可靠性上面.一起来看TC ...
- 毕业设计---json,Struts,ajax以及JQuery简单案例
<!-- Struts2的xml文件配置 --><struts> <package name="default" namespace="/& ...
- Beta阶段冲刺-4
一. 每日会议 1. 照片 2. 昨日完成工作 3. 今日完成工作 4. 工作中遇到的困难 杨晨露:热......算不算困难......? 戴志斌:找了好几种框架,改了不少 游舒婷:不能相信开发工具自 ...
- OpenFlow PacketOut消息机制
OpenFlow PacketOut消息机制 前言 由于最近实验的进行,遇到一个比较棘手的问题,就是利用控制器主动发送packet消息的问题,期间遇到一些问题,后来在RYU群中得到群友左木的帮助成功解 ...
- Android实现Service永久驻留
说实话,这是一种流氓行为.但有些时候又是不得不需要的.比如微信的NotifyReceiver.现在抛开这些伦理的东西不讲,我们只是来看看技术上怎么实现.在后台运行的service有几个途径可以将其停止 ...
- JAVA面对对象(二)——继承、方法的覆写
1.继承就是基于已存在的类构造一个新类,继承已存在的类就能复用类的方法和属性,并且能够添加新的方法和属性.也就是子类和父类 2.一个父类可以拥有多个子类,一个子类只允许有一个父类 3.用extends ...
- PAT 甲级 1022 Digital Library
https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336 A Digital Library cont ...
- 常用的sublime text 3插件(很爽哦)
个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...
- c++11 基于范围的for循环
c++11 基于范围的for循环 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> # ...