django之前后端不分离的操作(增删改查)

news2024/11/20 9:19:17

背景:
demo采用的是前后端不分离的操作,用Bootstrap作为前段页面框架使用

1.先说模板之间的继承(针对HTML来讲)

父模板中编写好公共代码块,例如一个网站的导航和footer部分

在内容部分注明

{%block content%}

{%end block}

ps: 其中conten为名字可以自定义,后面继承时记得保持一致即可

2.Django(url+view+HTML)

编写流程就是url+view+HTML 这个顺序看个人习惯,没有前后之分。

先说下view部分,也就是我们函数业务逻辑处理部分(上代码)===普通选手

查全部

def userlist(request):
     user_list=publish.objects.all().order_by('-id')
     return render(request,'userlist.html',{"user_list":user_list})

改数据

def usereditor(request,nid):
    if request.method=="GET":
       row_objec=models.publish.objects.filter(id=nid).first()
       return  render(request,'usereditor.html',{"row_objec":row_objec})
    name=request.POST.get("name")
    city=request.POST.get("city")
    models.publish.objects.filter(id=nid).update(name=name,city=city)
    return redirect('../userlist/')

删除数据

def  userdelete(request):
    nid=request.GET.get('nid')
    print(nid)
    models.publish.objects.filter(id=nid).delete()
    return redirect('../userlist/')

添加数据

def  useradd(request):
  if request.method=='GET':
     return  render(request,'useradd.html')
  name=request.POST.get("name")
  city=request.POST.get("city")
  models.publish.objects.create(name=name,city=city)
  return  redirect('../userlist/')

进阶选手=借用form 和modleform(君子性非异也,善假于物也。)

借用form

# 通过form实现
class pulishform(Form):
    name=forms.CharField(widget=forms.TextInput)
    city=forms.CharField(widget=forms.TextInput)
def useraddform(request):
    if request.method=="GET":
        form=pulishform()
        return render(request,'useraddform.html',{"form":form})

ps:return回去的数据最好写form 这里踩过坑 后面对数据处理总是有问题,还需要观察一下。

借用modelform

class pulishform1(forms.ModelForm):
    class Meta:
        model=models.publish
        # fields=['name','city']
        fields="__all__"
        widgets={
            'name':forms.TextInput(attrs={'class':'form-control'}),
            'city':forms.TextInput(attrs={'class':'form-control'}),
                 }
        # 这个还需要验证 我的是不能这样操作的
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            for name, field in self.fields.__getitem__(i=0):
                field.widget.attrs={"class":"form-control","placeholder":field.label}

#添加数据

def useraddmodleform(request):
    if request.method=="GET":
       form = pulishform1()
       return render(request, 'useraddmodleform.html', {"form": form})
    form=pulishform1(data=request.POST)
    if form.is_valid():
        form.save()
        return  redirect('../userlist/')
    return  render(request,'useraddmodleform.html',{"form":form})
#编辑
def usereditormodleform(request,nid):
    if request.method=="GET":
      row_object=models.publish.objects.filter(id=nid).first()
      form=pulishform1(instance=row_object)
      return  render(request,'usereditormodleform.html',{"form":form})
    row_object=models.publish.objects.filter(id=nid).first()
    form=pulishform1(data=request.POST,instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('../../userlist/')
    return  render(request,'usereditormodleform.html',{"form":form})

整体备注一下:如果django项目安装了debug_tools记得关掉 Intercept redirects,否则在redirect时会出现302页面

其次就是里面的路径:因为我是使用了二级路由,所以在项目的路由上不方便调试。如果使用的二级路由在redirect时可以考虑用相对路径即../../userlist/ 或者../userlist/根据自己项目和路由配置灵活调整。

在前端的路由需要熟悉模板语法

<td><a href="{% url 'userdelete'%}?nid={{ items.id }}" style="text-decoration: none">删除</a>

这里面的这部分{% url 'userdelete'%} 就直接匹配到位了

其次就是继承模板

{% extends "user_index.html" %}

编写模板中需要我们填充的部分

{% block content %}

#前端代码实现块

{%end block%}

还需要特别说明的就是bootstrap的使用,版本之间组件还有不同,用的时候需要特别关注、

其中在django中二级url中的配置如下:

# 普通的增删改查
path('userlist/',views.userlist),
path('useradd/',views.useradd,name='useradd'),
path('userdelete/',views.userdelete,name="userdelete"),
path('<int:nid>/update/',views.usereditor,name='usereditor'),
# modleform 和from
path('useraddform/', views.useraddform, name='useraddform'),
path('useraddmodleform/', views.useraddmodleform, name='useraddmodleform'),
path('<int:nid>/modelupdate/', views.usereditormodleform, name='useraddmodleform'),

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

53 记一次自定义 classloader 导致的 metadataspace OOM

前言 这是最近 flink 集群上面暴露出现的一个问题 具体的细节原因 就是 flink 上面提交任务的时候, 自定义的 classloader 加载 driver.jar 然后导致 metaspace OOM 由于这边的 TaskManager metadataspace 配置相对较小(MaxMetaspaceSize配置为96M), 然后导致 出现了 metada…

BUUCTF Misc [SUCTF2018]single dog 我吃三明治 sqltest [SWPU2019]你有没有好好看网课?

[SUCTF2018]single dog 下载文件 使用kali的binwalk工具分析 进行文件分离 解压其中的压缩包&#xff0c;得到1.txt 看内容应该是js加密后的结果&#xff0c;复制到AAEncode在线解密网站 得到flag flag{happy double eleven} 我吃三明治 下载文件 使用010 eito…

AICodeHelper - AI编程助手

AICodeHelper是一款AI编程助手&#xff0c;旨在帮助程序员提高他们的编码技能。 简单的像尝试的代码直接问就行&#xff0c;但是一些复杂的&#xff0c;就得需要写技巧&#xff1b; 下面是几个使用的小技巧&#xff1a;链接是&#xff1a;AICodeHelper 1.可以使用中文提问&a…

深度学习Faster-RCNN网络

目录1 网络工作流程1.1 数据加载1.2 模型加载1.3 模型预测过程1.3.1 RPN获取候选区域1.3.2 FastRCNN进行目标检测2 模型结构详解2.1 backbone2.2 RPN网络2.2.1 anchors2.2.2 RPN分类2.2.3 RPN回归2.2.4 Proposal层2.4 ROIPooling2.5 目标分类与回归3 FasterRCNN的训练3.1 RPN网…

Yolov5移植树莓派实现目标检测

Hallo&#xff0c;大家好啊&#xff01;之前写了几篇Yolov5相关项目的博客&#xff0c;然后学习了树莓派之后&#xff0c;更新了几篇树莓派的博客&#xff0c;我的最终目的是将Yolov5移植到树莓派&#xff0c;通过树莓派上面的摄像头实现目标检测。你想啊&#xff0c;在工厂里面…

【word文档使用方法记录】论文格式修改

word文档使用方法记录**去掉文档都以也封面的页眉&#xff1a;****WPS公式居中&#xff0c;公式号右对齐**为论文每个章节设置不同的页眉去掉文档都以也封面的页眉&#xff1a; 将光标定位在第一页页尾&#xff0c;进入“页面布局”选项卡&#xff0c;点击“分隔符”&#xff…

【MySQL数据库入门】:数据库基础和基本操作

文章目录1. 数据库基础1.1 什么是数据库1.2 主流数据库1.3 如何配置环境1.4 链接数据库1.5服务器&#xff0c;数据库&#xff0c;表关系2.基本的数据库操作3.MySQL架构4.SQL分类5.存储引擎5.1查看存储引擎5.2 存储引擎对比6.总结1. 数据库基础 1.1 什么是数据库 存储数据用文…

安装包UI美化之路-在线安装包

在一些安装场景中&#xff0c;由于完整的安装包很大&#xff0c;下载时间长&#xff0c;且下载后需要人工干预来进行安装&#xff0c;这样会一定程度的降低用户使用体验&#xff1b;nsNiuniuSkin安装包制作解决方案提供了一种在线版本的安装包&#xff0c;支持将实际要安装的内…

C++中delete 和 delete []的真正区别

1.我们通常从教科书上看到这样的说明&#xff1a; delete 释放new分配的单个对象指针指向的内存 delete[] 释放new分配的对象数组指针指向的内存 那么&#xff0c;按照教科书的理解&#xff0c;我们看下下面的代码&#xff1a; int *a new int[10]; delete a; //方…

Java | 详解 Java连接MySQL、编写JdbcUtils工具类、使用数据库连接池、使用JavaTemplate

一、连接mysql数据库 步骤&#xff1a; 1、启动 MySQL &#xff1a;以管理员身份打开 cmd 命令行&#xff0c;输入 net start mysql 2、在 MySQL 创建一张表&#xff0c;用于后面的操作。我这里创建了一张 user 表&#xff0c;有id、name、password三个字段。 3、导入jar包 (1)…

【总结】最系统化的CV内容,有三AI所有免费与付费的计算机视觉课程汇总(2022年12月)...

欢迎大家关注有三AI的计算机视觉课程系列&#xff0c;我们的课程系列共分为5层境界&#xff0c;内容和学习路线图如下&#xff1a;第1层&#xff1a;掌握学习算法必要的预备知识&#xff0c;包括Python编程&#xff0c;深度学习基础&#xff0c;数据使用&#xff0c;框架使用等…

基于xml的自动装配之byType

基于xml的自动装配之byType 使用bean标签的autowire属性设置自动装配效果 自动装配方式&#xff1a;byType byType&#xff1a;根据要赋值的属性的类型&#xff0c;在IOC容器中匹配某个兼容类型的bean&#xff0c;为属性自动赋值 若在IOC中&#xff0c;没有任何一个兼容类型的b…

net/http 库的客户端实现(下)

前言 上一篇文章我们讲了 net/http 库客户端 request 的构建&#xff0c;接下来继续讲构建HTTP请求之后的处理操作 net/http 库的客户端实现(上) 启动事务 构建 HTTP 请求后&#xff0c;接着需要开启HTTP事务进行请求并且等待远程响应&#xff0c;以net/http.Client.Do()方法…

stm32f407VET6 系统学习 day01 GPIO 配置

1. GPIO 的5个配置 GPIO,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F407有7组IO。分别为GPIOA~GPIOG&#xff0c;每组IO有16个IO口&…

首创证券上交所上市:募资19亿市值306亿 上半年净利降14%

雷递网 雷建平 12月23日首创证券股份有限公司&#xff08;简称&#xff1a;“首创证券”&#xff0c;股票代码为&#xff1a;“601136”&#xff09;昨日在上交所上市。首创证券此次发行27,333.38万股&#xff0c;发行价为7.07元&#xff0c;募资总额为19亿元。首创证券首日收盘…

小学生C++编程基础 课程10

938.最小公倍数的简单方法 &#xff08;课程A&#xff09; 难度&#xff1a;1 登录 939.最大公约数的简单方法 ( 课程A&#xff09; 难度&#xff1a;1 登录 940.韩信点兵 &#xff08;课程A&#xff09; 难度&#xff1a;1 登录 941.求123…N的和 &#xff08;课程A&#x…

Bloom filter-based AQM 和 BBR 公平性

设 B 为 Delivery rate&#xff0c;D 为 Delay&#xff0c;将 E B/D 作为衡量效能&#xff0c;所有流量的收敛状态是一个 Nash 均衡&#xff0c;没有任何流量有动机增加或者减少 inflight。参见&#xff1a;更合理的 BBR。 并不是都知道这道理&#xff0c;增加 inflight 能挤…

Java环境配置——Linux 安装JDK

注意这是用普通用户登录后&#xff0c;单独设置用户的java环境变量&#xff0c;非root用户 root用户的编辑命令是 vi /etc/profile 下载安装包 创建java目录 mkdir java 进入目录 cd java 上传安装包 将jdk-8u161-linux-x64.tar.gz上传到java目录 配置环境变量 解压安…

并查集详解

1.并查集原理 某公司今年校招全国总共招生10人&#xff0c;西安招4人&#xff0c;成都招3人&#xff0c;武汉招3人&#xff0c;10个人来自不同的学校&#xff0c;起先互不相识&#xff0c;每个学生都是一个独立的小团体&#xff0c;现给这些学生进行编号&#xff1a;{0, 1, 2,…

156. 如何在 SAP UI5 应用里显示 PDF 文件

SAP 不少标准应用都可以在业务流程进行到某个阶段,根据系统里的业务数据和 SAP 事先开发好的表单模板,生成最终的 PDF 文件并显示在应用页面上。 本文介绍一种在 SAP UI5 页面里嵌入显示 PDF 文件内容的方式,效果如下。 点击屏幕右上角的下载图标,可以将这个显示的 PDF 下…