【Youtobe trydjango】Django2.2教程和React实战系列十【动态路由、app内部路由】
【Youtobe trydjango】Django2.2教程和React实战系列十【动态路由、app内部路由】
- 1. 动态路由示例
- 1.1 动态路由
- 1.2 处理DoesNotExist不存在
- 2. 如何删除对象
- 3. 如何获取对象列表
- 4. 动态链接网址
- 5. 整理前面的各层级视图功能
- 6. app应用内部url
1. 动态路由示例
1.1 动态路由
views.py
def dynamic_lookup_view(request, id):obj = Product.objects.get(id=id)context = {'object': obj,}return render(request, "products/product_detail.html", context)
trydjango\urls.py
from products.views import dynamic_lookup_viewpath('products/<int:id>', dynamic_lookup_view, name='product'), # 产品
效果
1.2 处理DoesNotExist不存在
当我们输入一个不存在的id进行查询:
views.py
中dynamic_lookup_view
方法
obj = get_object_or_404(Product, id=id)
或者
try:obj = Product.objects.get(id=id)
except Product.DoesNotExist:raise Http404
让页面返回404结果即可:
2. 如何删除对象
products\views.py
def product_delete_view(request, id):obj = get_object_or_404(Product, id=id)# POST requesttif request.method == "POST":# 确认删除obj.delete()return redirect('/') # 删除后页面重定向回主页context = {'object': obj,}return render(request, "products/product_delete.html", context)
新建模板文件
products\product_delete.html
{% extends 'base.html' %}{% block content %}
<form action='.' method='POST'> {% csrf_token %}<h1>确认要删除产品 “{{ object.title }}”?</h1><p><input type='submit' value='确定' /> <a href='../'>取消</a></p>
</form>
{% endblock %}
效果
3. 如何获取对象列表
products\views.py
中新建product_list_view
方法
def product_list_view(request):queryset = Product.objects.all()context = {'object_list': queryset,}return render(request, "products/product_list.html", context)
trydjango\urls.py
路由
from products.views import product_list_viewpath('products/', product_list_view, name='product-list'), # 产品列表
模板文件products/product_list.html
{% extends 'base.html' %}{% block content %}{% for instance in object_list %}<p>{{ instance.id }} - {{ instance.title }}</p>{% endfor %}{% endblock %}
4. 动态链接网址
如何从上一步骤的查询出的列表清单跳转到单个对象的详情页或修改、删除页面?
模型文件products/models.py
from django.urls import reversedef get_absolute_url(self):return reverse("product-detail", kwargs={"id": self.id})
模板文件products/product_list.html
{% extends 'base.html' %}{% block content %}{% for instance in object_list %}<p>{{ instance.id }} - <a href='{{ instance.get_absolute_url }}'>{{ instance.title }}</a></p>
{% endfor %}{% endblock %}
urls.py
中name
修改下:
path('products/<int:id>', dynamic_lookup_view, name='product-detail'), # 产品
点击a标签即可跳转过去
5. 整理前面的各层级视图功能
在此先整理前面的各层级视图功能
整理各文件如下:
src\trydjango\products\templates\forms.py
from django import formsfrom .models import Productclass ProductForm(forms.ModelForm):title = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': "[Your title]"}))price = forms.DecimalField(initial=999999999)description = forms.CharField(required=False,widget=forms.Textarea(attrs={'class': "new-class-name two",'id': "my-id-for-textarea",'rows': 20,'cols': 100,}))class Meta:model = Productfields = ['title','price','description',]def clean_title(self, *args, **kwargs):title = self.cleaned_data.get('title')if not "[" in title:raise forms.ValidationError("This is not a valid title, title should in []")if not "]" in title:raise forms.ValidationError("This is not a valid title, title should in []")return titleclass RawProductForm(forms.Form):title = forms.CharField(label='', widget=forms.TextInput(attrs={'placeholder': "Your title"}))description = forms.CharField(required=False,widget=forms.Textarea(attrs={'class': "new-class-name two",'id': "my-id-for-textarea",'rows': 20,'cols': 100,}))price = forms.DecimalField(initial=66.6)
src\trydjango\products\templates\products\product_create.html
一定要注意action
里面参数是create
{% extends 'base.html' %}{% block content %}
<form action='create' method='POST'> {% csrf_token %}{{ form.as_ul }}<input type='submit' value='Save' />
</form>
{% endblock %}
src\trydjango\products\views.py
from django.shortcuts import get_object_or_404, redirect, renderfrom .forms import ProductForm
from .models import Productdef product_create_view(request):form = ProductForm(request.POST or None)if form.is_valid():form.save()form = ProductForm()else:print(form.errors)context = {'form': form,}return render(request, "products/product_create.html", context)def product_update_view(request, id=id):obj = get_object_or_404(Product, id=id)form = ProductForm(request.POST or None, instance=obj)if form.is_valid():form.save()context = {'form': form,}return render(request, "products/product_create.html", context)def product_list_view(request):queryset = Product.objects.all() # 对象列表context = {'object_list': queryset,}return render(request, "products/product_list.html", context)def product_detail_view(request, id):obj = Product.objects.get(id=id)context = {'object': obj,}return render(request, "products/product_detail.html", context)def product_delete_view(request, id):obj = get_object_or_404(Product, id=id)if request.method == "POST": # 确认删除obj.delete()return redirect('/') # 删除后页面重定向回主页context = {'object': obj,}return render(request, "products/product_delete.html", context)
src\trydjango\trydjango\urls.py
"""trydjango URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import pathfrom pages.views import about_view, contact_view, home_view, social_view
from products.views import (product_create_view, product_delete_view,product_detail_view, product_list_view,product_update_view)urlpatterns = [path('products/', product_list_view, name='product-list'), # 列表path('products/create', product_create_view, name='product-list'), # 列表path('products/<int:id>', product_detail_view, name='product-detail'), # 详情path('products/<int:id>/update/', product_update_view, name='product-update'), # 修改path('products/<int:id>/delete/', product_delete_view, name='product-delete'), # 删除path('', home_view, name='home'), # 主页path('about/', about_view, name='product-detail'), # 关于path('contact/', contact_view), # 联系方式path('admin/', admin.site.urls), # 自带用户管理
]
6. app应用内部url
【Youtobe trydjango】Django2.2教程和React实战系列十【动态路由、app内部路由】相关推荐
- 【Youtobe trydjango】Django2.2教程和React实战系列六【自定义主页、路由与请求】
[Youtobe trydjango]Django2.2教程和React实战系列六[自定义主页.路由与请求] 1. 初始化主页应用 2. 修改视图 3. 项目url增加主页路由 4. 路由 1. 初始 ...
- 【Youtobe trydjango】Django2.2教程和React实战系列四【创建Django应用】
[Youtobe trydjango]Django2.2教程和React实战系列四[创建Django应用] 1. 创建应用 2. 修改应用 1. 创建应用 打开cmd黑框,也可以用下列方法打开项目根目 ...
- 【Youtobe trydjango】Django2.2教程和React实战系列二【settings配置文件】
[Youtobe trydjango]Django2.2教程和React实战系列二[settings配置文件] 1. Django项目初始化过程 2. 全貌 3. 详细解释 4. 增加其他配置 1. ...
- 【Youtobe trydjango】Django2.2教程和React实战系列五【python shell操作models模型】
[Youtobe trydjango]Django2.2教程和React实战系列五[python shell操作models模型] 1. 用python shell查询新增models对应的数据 2. ...
- 【Youtobe trydjango】Django2.2教程和React实战系列七【模板templates和Django模板引擎】
[Youtobe trydjango]Django2.2教程和React实战系列七[模板templates和Django模板引擎] 1. 修改视图函数 2. 新建模板文件夹和html文件 3. 项目配 ...
- 【Youtobe trydjango】Django2.2教程和React实战系列一【项目简介 | 搭建 | 工具】
[Youtobe trydjango]Django2.2教程和React实战系列一[项目简介 | 搭建 | 工具] 1.环境与选型说明 2.技术栈选型说明 3.django搭建详解 3.1. 项目虚拟 ...
- 【Youtobe trydjango】Django2.2教程和React实战系列三【Django超级管理员和内置内容】
[Youtobe trydjango]Django2.2教程和React实战系列三[Django超级管理员和内置内容] 1. Django数据初始化及超级管理员 2. 用户模块使用 1. Django ...
- 【Youtobe trydjango】Django2.2教程和React实战系列八【渲染数据库数据与模板加载顺序探究】
[Youtobe trydjango]Django2.2教程和React实战系列八[渲染数据库数据与模板加载顺序探究] 1. 准备数据 2. 渲染数据库数据到模板 3. 如何在app里加载django ...
- 在线报表设计实战系列 – 制作动态列与静态列混排的报表(5)
在线报表设计实战系列 – 制作动态列与静态列混排的报表(5) 葡萄城报表是一套强大的报表开发和系统搭建工具,既能与您开发的报表软件项目紧密集成,也可独立部署运行,支持多数据源,具有无编码.灵活.稳定等 ...
最新文章
- openGL 入门4 --- Following the data
- 编java用jdk还是editplus_怎样运用EditPlus进行配置Java编译环境
- c++学习4 -- 输入输出
- 第九天2017/04/18(1、友元函数、运算符重载)
- redis的增加元素操作
- style对象的cssText方法
- php递归删除文件,PHP 递归删除文件夹
- 【NLP】毕设学习笔记(七)前馈神经网络代表者——卷积神经网络无公式理解
- 解决ipad,ios录屏保存失败-5823
- Calendar类和GregorianCalendar类
- C语言实现简单学籍管理系统
- 美网络司令部:马上修复严重的 PAN-OS 漏洞,免遭国家黑客攻击
- Apache Hive 建表操作的简单描述
- 视频教程-思科路由器搭建终极实战-网络技术
- 什么是冲激函数、时域卷积、冲激响应以及频响曲线
- PS1045L-ASEMI肖特基二极管PS1045L正向压降怎么测
- 安卓期末大作业——Android水果连连看
- 苹果手机微信声音小怎么调大声_苹果6plus听筒没声音,学会这招自己就能解决...
- 阿里云服务器ECS购买教程
- 服务器连接数据库mysql
热门文章
- 三大引流+三大话术绝招。告别小白瓶颈期!
- 1134 最长递增子序列(时间复杂度O(n*log(n))
- 国内做SRM系统的公司哪家比较好?如何利用SRM系统管理好供应商?
- 搭建博客网站详细报告
- 微信小程序0.11.122100版本新功能解析
- uniapp中开发APP时渲染后台返回的二维码并保存到系统相册
- 2022-2028全球与中国公共行业微电网市场现状及未来发展趋势
- Jenkins,Ant 配置学习笔记
- calcite 启发式优化器(HepPlanner)原理与自定义优化规则实现
- 报错:JSON parse error: Unexpected character (‘ ‘ (code 160)): was expecting double-quote to start fiel