首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在一次提交中保存父窗体、子窗体和孙窗体- django

在Django中,可以使用表单和视图来实现一次提交保存父窗体、子窗体和孙窗体的数据。

  1. 首先,需要定义父窗体、子窗体和孙窗体对应的模型类,分别表示它们在数据库中的存储结构。
  2. 接下来,可以创建三个表单类,分别对应父窗体、子窗体和孙窗体的数据输入。这些表单类可以继承自Django的forms.Form类,通过定义各个字段来指定需要输入的数据项。
  3. 在视图函数中,需要处理一次提交的逻辑。可以通过使用Django的表单处理机制,将用户提交的数据与表单类进行绑定,并进行验证。如果验证通过,可以通过表单对象获取用户输入的数据,并进行相应的处理。
  4. 在前端页面中,可以通过在HTML表单中使用Django提供的模板标签和过滤器,将表单字段与相应的HTML元素进行绑定,实现数据的输入和展示。

下面是一个简单示例代码:

models.py:

代码语言:txt
复制
from django.db import models

class Parent(models.Model):
    name = models.CharField(max_length=100)

class Child(models.Model):
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

class Grandchild(models.Model):
    child = models.ForeignKey(Child, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

forms.py:

代码语言:txt
复制
from django import forms

class ParentForm(forms.Form):
    name = forms.CharField(max_length=100)

class ChildForm(forms.Form):
    parent_id = forms.IntegerField(widget=forms.HiddenInput())
    name = forms.CharField(max_length=100)

class GrandchildForm(forms.Form):
    child_id = forms.IntegerField(widget=forms.HiddenInput())
    name = forms.CharField(max_length=100)

views.py:

代码语言:txt
复制
from django.shortcuts import render, redirect
from .forms import ParentForm, ChildForm, GrandchildForm
from .models import Parent, Child, Grandchild

def save_data(request):
    if request.method == 'POST':
        parent_form = ParentForm(request.POST)
        child_form = ChildForm(request.POST)
        grandchild_form = GrandchildForm(request.POST)
        if parent_form.is_valid() and child_form.is_valid() and grandchild_form.is_valid():
            # 保存父窗体数据
            parent = Parent(name=parent_form.cleaned_data['name'])
            parent.save()
            
            # 保存子窗体数据
            child = Child(parent=parent, name=child_form.cleaned_data['name'])
            child.save()
            
            # 保存孙窗体数据
            grandchild = Grandchild(child=child, name=grandchild_form.cleaned_data['name'])
            grandchild.save()
            
            return redirect('success')
    else:
        parent_form = ParentForm()
        child_form = ChildForm()
        grandchild_form = GrandchildForm()
    
    return render(request, 'form.html', {'parent_form': parent_form, 'child_form': child_form, 'grandchild_form': grandchild_form})

def success(request):
    return render(request, 'success.html')

form.html:

代码语言:txt
复制
<form method="post" action="{% url 'save_data' %}">
  {% csrf_token %}
  {{ parent_form.as_p }}
  {{ child_form.as_p }}
  {{ grandchild_form.as_p }}
  <input type="submit" value="Submit">
</form>

success.html:

代码语言:txt
复制
<h1>Data saved successfully!</h1>

在这个示例中,我们定义了三个模型类,分别表示父窗体、子窗体和孙窗体的数据结构。然后,我们创建了三个表单类,用于输入对应的数据。在视图函数中,我们处理了一次提交的逻辑,将用户提交的数据保存到数据库中。最后,我们在前端页面中使用表单类生成了HTML表单,并通过提交按钮将用户输入的数据发送到服务器。

推荐的腾讯云相关产品:腾讯云服务器(https://cloud.tencent.com/product/cvm),腾讯云对象存储(https://cloud.tencent.com/product/cos),腾讯云数据库(https://cloud.tencent.com/product/cdb)。这些产品可以提供云计算领域所需的服务器、存储和数据库等基础设施。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C#学习笔记—— 常用控件说明及其属性、事件

25、MDI 应用程序设计 1.MDI应用程序的概念 在前面的章节,所创建的都是单文档界面(SDI)应用程序。这样的程序(记事本画图程序)仅支持一次打开一个窗口或文档。...而使用多文档界面(MDI)程序(WordAdobePhotoshop)时,用户可以同时编辑多个文档。MDI程序的应用程序窗口称为窗口,应用程序内部的窗口称为窗口。...除此以外,窗口的行为与任何其他窗口一样(可以关闭、最小化调整大小等)。...与MDI应用程序设计有关的方法,一般只使用窗体的LayoutMdi方法,该方法的调用格式如下: MDI窗体名.LayoutMdi(Value); 该方法用来在MDI窗体中排列MDI窗体,以便导航操作...常用的 MDI 窗体的事MdiChildActivate,当激活或关闭一个 MDI窗体时将发生该事件。 3.菜单合并 窗体窗体可以使用不同的菜单,这些菜单会在选择窗体的时候合并。

9.6K20

WPF自学入门(八)WPF窗体之间的交互

今天我们一起来看一下WPF窗体之间的交互-窗体之间的传值。有两个窗体,一个是窗体,一个是窗体。要将窗体的文本框的值传递给窗体的控件。我们该怎么实现?...窗体的界面: ? 要实现传值,我们首先要在窗体定义一个可读可写的公用的字符串:getMessage。然后在窗体按下按钮的时候,定义一个字符串Message,用来存放输入框的文字。...再将Message存放的输入框的文字传递给窗体定义的可读可写的公用字符串getMessage。下面看一下实现的后台代码: 窗体的后台代码: ? 窗体的后台代码: ?...这里我进行假设一个场景,依然还是有父子窗体窗体窗体中一个按钮的属性设置器,在窗体添上要设置属性的值,然后按设置完成,窗体关闭,窗体的相应按钮的属性也根据窗体的设置值而改变!...首先声明了窗体,然后child.CallBackMethod设置为自己的函数Method,当然这个Method委托的参数是一致的,然后就在这里响应委托给过来的参数,处理。

2.4K10
  • 【愚公系列】2023年11月 Winform控件专题 Form控件详解

    添加窗体的方式有两种,一种是在代码创建一个新的窗体,另一种是在窗体设计器创建一个窗体控件。...在执行该代码后,点击按钮,就会在MainForm窗体创建一个ChildForm窗体,该窗体可以在MainForm的客户区中移动调整大小。...1.11 MainMenuStripMainMenuStrip是Winform的一个控件,它通常用于主窗体,包含一系列菜单菜单。...可以通过设计器界面或者代码来添加菜单菜单。3.通过事件处理程序响应菜单或菜单的点击事件,可以在代码实现对应的功能。...使用DoubleBuffered可以在控件绘制过程中使用一个缓冲区,当绘制完成时,将缓冲区的内容一次性绘制到屏幕上,以达到平滑绘制的效果。

    2.2K21

    控件anchordock属性_控件的常用属性

    ,这个属性有四个可以开启或关闭的值 * Top–表示控件窗体控件)相关的顶部应该保持固定 * Bottom–表示控件窗体控件)...相关的底部应该保持固定 * Left–表示控件窗体控件)相关的左边缘应该保持固定 * Right–表示控件窗体控件)相关的右边缘应该保持固定...虽然Anchor属性也可以实现这一点,但是Dock属性使得能够在窗体窗体可以再上方(或旁边)互相堆叠,如果某个子窗体改变了大小,其它停驻在它旁边的窗体也会随之改变。...Anchor属性不同的是,可以将Dock属性设置为一个单值: *Top–迫使控件位于窗体(或控件)的顶部,如果有同一个窗体的其它控件也被设置为停驻在顶部的话,那么控件将在彼此上方互相堆叠...)的右边,如果有同一个窗体的其它控件也被设置为停驻在右边的话,那么控件将在彼此旁边互相堆叠 * Fill–迫使控件位于窗体(或控件)的上方,如果有同一个窗体的其它控件也被设置为停驻在上方的话

    1.4K30

    C++ Qt开发:自定义Dialog对话框组件

    在之前的文章笔者已经为大家展示了默认Dialog组件的使用方法,虽然内置组件支持对数据的输入,但有时候我们需要一次性输入多个数据,此时如果之使用默认模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框...自定义对话框需要解决的问题是,如何让窗体窗体进行数据交换,要实现数据的交换有两种方式,第一种方式是通过动态加载模态对话框,当用户点击确定后通过GetValue()来拿到数据,而第二种方式则是通过发送信号的方式将数据投递给窗体...时则是获取窗体内的值,此时通过调用ptr->GetValue()窗体的成员函数来返回一个字符串,并将其设置到窗体的编辑框内,主函数代码如下所示; // 首先要包含Dialog对话框类 #include...:endl; ui->lineEdit->setText(the_value); } // 删除释放对话框句柄 delete ptr; } 至此就实现了参数的窗体传递到窗体...,而由于是信号控制,所以当发送参数到窗体后,窗体并不会立即关闭,如下图所示; 完整案例下载

    52510

    VB.NET窗体继承「建议收藏」

    对比第一次敲的机房收费系统,会发现很多窗体的界面基本相同,部分功能甚至基本相似。比如说操作员菜单下的充值退卡这两个窗体: 这样如果一个一个窗体画出来,就做了很多重复的工作。...VB.NETC#都是完全面向对象的语言,而面向对象的三大特性是封装、继承、多态,出了在代码、功能上来体现,在设计窗体时是不是也可以用到呢?答案当然是YES!...如果一个程序中有多个界面相似,就可以考虑通过继承来实现,先建立一个窗体,然后让窗体来继承它,相同的代码就可以写在窗体,各自的功能分别写在不同的窗体,实现想要的功能。...(建好后需要重新生成解决方案) 2.选择项目菜单下的添加新项,在弹出的窗体做如下选择: 3.选择“添加”按钮,在弹出的窗体中选择要继承的窗体,点确定即可。...4.继承来的充值窗体: 基本上已经完成了,但是会发现继承来的窗体的控件都是锁定的,如果想要通过这些控件添加一些新的功能,就需要将窗体的控件Modifiers属性设置为Public,这样就可以了

    79810

    C++ Qt开发:自定义Dialog对话框组件

    在之前的文章笔者已经为大家展示了默认Dialog组件的使用方法,虽然内置组件支持对数据的输入,但有时候我们需要一次性输入多个数据,此时如果之使用默认模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框...自定义对话框需要解决的问题是,如何让窗体窗体进行数据交换,要实现数据的交换有两种方式,第一种方式是通过动态加载模态对话框,当用户点击确定后通过GetValue()来拿到数据,而第二种方式则是通过发送信号的方式将数据投递给窗体...时则是获取窗体内的值,此时通过调用ptr->GetValue()窗体的成员函数来返回一个字符串,并将其设置到窗体的编辑框内,主函数代码如下所示;// 首先要包含Dialog对话框类#include...lineEdit->setText(the_value); } // 删除释放对话框句柄 delete ptr;}至此就实现了参数的窗体传递到窗体...,而由于是信号控制,所以当发送参数到窗体后,窗体并不会立即关闭,如下图所示;完整案例下载

    42010

    C#记事本项目开发,一个可以实现批量操作的记事本!【附源码】

    C#的记事本开发需要我们定义两个窗体,也就是一个承载所有记事本的窗体,一个具有记事本基本功能的窗体。 . 记事本子窗体 所以我们首先来聊一下具有记事本基本功能的窗体的开发。...在C#的窗体应用,我们可以直接对界面进行控件布局,不需要使用代码定义控件,在这一点上C#的窗体应用开发是很不错的。...那么在记事本应用,我们应该添加在窗体的控件应该有,文件的新建、打开、保存,以及字体的样式、字号、是否加粗倾斜这些基本的记事本控件。同时当然还需要记事本的编辑文本框,方便我们对内容的修改输入。...主控页面窗体 接下来就是承载记事本编辑窗口的窗体了。 在窗体需要包括的控件有记事本的新建、关闭、全部关闭、退出等。...FormSon son = new FormSon(); //定义子窗体窗体 son.MdiParent = this; //显示窗体 son.Show(

    1.9K10

    实现iframe窗体窗体的通信

    本文主要会介绍如何基于MessengerJS,实现iframe窗体窗体间的通信,传递数据信息。同时本文会提供一个可运行的实例代码,实现在窗体,获取到来自窗体的数据的效果。...1.2 使用方法 (1) 在需要通信的窗体窗体的文档,都需要引入MessengerJS。...(2) 窗体窗体各自的文档(document),都需要自己的Messenger与其他文档通信,窗体窗体的window对象都对应着有且仅有一个Messenger对象,该Messenger对象会负责当前..., 'iframe2'); (5) 发消息时,要指定messenger的名字消息,例如窗体要给窗体发消息:  // 窗口中 - 向单个iframe发消息  messenger.targets['...这里分别是窗体窗体的代码实现,可直接在浏览器打开查看效果,其中messenger.js可以在这里下载,放到项目目录下。 窗体: <!

    9.8K771

    初步学习Qt布局

    介绍 Qt包含一个布局管理类的集合,它们被用来描述widgets如何在应用程序的用户界面呈现的。...布局会自动重新定义它们的类(通过QWidget::setParent())以确保它们是装载布局的widget的子类。 注意1:布局的控件是装载布局控件的控件,不是布局的控件。...在通过函数,需要再次使用,最好将结果保存在本地变量。 在同样函数的同一个元素,不应该调用两次 QLayoutItem::setGeometry()。...Qt手册《Layout Management》 窗体小部件布局 窗体小部件 窗体小部件(Widgets)是Qt创建用户界面的主要元素。...窗体小部件可以显示数据状态信息,接受用户输入,提供组织其他窗体小部件的容器。 没有嵌入到窗体小部件的部件被称为窗口(window)。

    7K10

    构建布局良好的Windows程序

    工具箱→菜单工具栏 菜单栏 MenuStrip的类型 MenuItem:菜单项 TextBox:文本框 ComboBoX:组合框 Separato:分割线 前面都有ToolStrip做前缀 Applaction.Exit...() 退出整个应用程序,关闭所有窗体 this.Close()  关闭当前窗体 都会触发FormClosed事件FormClosing事件 带图片的工具栏 属性名称     说明 displaystyle...按住Ctrl键选择多个控件,再设置anchor属性,可以一次选中多个控件 使用dock(停靠控件) dock属性 将控件停靠在窗体的边缘或填充窗体 当某个控件需要充满整个窗体时,设置控件的dock属性是最快捷的方式...SdI:比如记事本 Word等 mdi:多窗口应用程序 比如Excel 浏览器等 至少由连个窗口组成 包括顶级框架窗口(也叫mdi容器)其他文档窗口(也叫窗口) 创建mdi的步骤 1窗体的ISMDIIContainer...属性设为true 窗体的Mdiparent属性设为窗体 注意: 设置了MDI窗体不能用SHowDialog() 建立窗体窗口列表的步骤 设置窗体菜单控件的mdiwindowlistItem属性选定为窗口菜单项

    1.5K60

    利用委托实现winform多个窗体间的传值

    最近用C#做上位机程序开发,要实现这样一个功能: 窗体创建了两个子窗体——窗体1窗体2,窗体1产生的数据要在窗体2显示出来。...窗体1发送消息给窗体窗体1定义一个委托 public delegate void SendMsg(string msg); 再定义一个事件 public event SendMsg send...上面子窗体1已经注册好了委托事件,接下来需要窗体订阅该事件。...窗体转发消息给窗体2 这回等于是窗体窗体发消息,所以我们在窗体定义委托事件,然后让窗体2去订阅,代码如下,我们先去掉关于窗体1的那部分以方便观察。...这时候transfer事件被触发,窗体2的getMsg就会被执行 public void getMsg(string str) { BeginInvoke

    1.5K30

    使用C++实现的仿Wallpaper动态壁纸软件(含源文件)

    在上一篇博客,已经介绍了wallpaper的实现原理,并用C#实现,本文将使用C++Qt框架实现,由于之前已经介绍过具体思路,本文将跳过分析过程,直接上代码。...(hwnd,0x052C,0,0); 最终代码 //获取背景窗体句柄 HWND GetBackground() { //背景窗体没有窗体名,但是知道它的类名是workerW,且有窗体Program...Maneger,所以只要 //遍历所有workW类型的窗体,逐一比较它的窗体是不是Program Manager就可以找到背景窗体 HWND hwnd = FindWindowA("...,需要新建窗体并设置为背景层窗体窗体,而之后就不用了,因此设立布尔变量firstPlay来判断是否第一次打开文件 bool firstPlay = true; void Widget::on_openButton_clicked...将child窗体设置为背景层窗体窗体 void SetBackground(HWND child){ SetParent(child,GetBackground()); } 最终效果 内存

    1.4K10

    前端之bootstrap模态框

    简介:模态框(Modal)是覆盖在窗体上的窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开窗体的情况下有一些互动。窗体可提供信息、交互等。...Modal简介 Modal实现弹出表单 Modal实现删除提示框 其他用法 Bootstrap 模态框(Modal)插件 模态框(Modal)是覆盖在窗体上的窗体。...通常,目的是显示来自一个单独的源的内容,可以在不离开窗体的情况下有一些互动。窗体可提供信息、交互等。 如果您想要单独引用该插件的功能,那么您需要引用 modal.js。... 提交更改...如果您仔细查看上面的代码,您会发现在 标签,data-target="#myModal" 是您想要在页面上加载的模态框的目标。

    3.5K50

    写字板(Windows程序设计)

    保存,支持txt、rtf; 实现多格式的文本的编辑、修饰等,均有相应的菜单来控制,常用的菜单项配备相应的工具栏按钮(可参照Windows自带的写字板) 按需添加其他的代码,窗口的布局等; 实现自定义的查找对话框...,有能力的同学可进一步实现替换/全文替换等功能 状态栏显示学生学号、姓名等信息,在窗口的标题中显示当前正在编辑的文件名 (可选)其他你觉得实用的功能:支持word等 (可选)将其改造成MDI程序:窗口中包含新建...其实本质上来说都是对richtextbox的一些属性的修改,注意多用DropDownOpening,DropDownItemClicked等操作代替Click,使代码更加精简高效   这是一个MDI调整窗体使用...case "层叠": LayoutMdi(MdiLayout.Cascade); break; } } MDI的使用,是为了让一个窗体拥有许多个子窗体...,进行更加简单有效的操作 在窗体new窗体就行,记得一系列基本操作,你也可以通过生成函数属性进行快速高效设置 private void 新建ToolStripMenuItem_Click(object

    1.1K10

    FindWindowEx使用方法「建议收藏」

    类名窗体名称给定的字符串匹配形式。这个功能看起来窗体,从在一个给定的窗体窗体回到下一个起始行。 当寻找不大写小写之间的区别。...LPCTSTR lpszClass,LPCTSTR lpszWindow); 參数: hwndParent:要查找窗体窗体句柄。...假设hwnjParent为NULL,则函数以桌面窗体窗体,查找桌面窗体的全部窗体。 Windows NT5.0 and later:假设hwndParent是HWND_MESSAGE。...函数仅查找全部消息窗体。 hwndChildAfter :窗体句柄。查找从在Z序的下一个窗体開始。 窗体必须为hwndPareRt窗体的直接窗体而非后代窗体。...查找从hwndParent的第一个窗体開始。假设hwndParent hwndChildAfter同一时候为NULL。则函数查找全部的顶层窗体及消息窗体

    1.4K20

    使用C#开发数据库应用程序

    ,默认为true ShowInTaskbar 确定窗体是否出现在Windows任务栏,默认为true StartPosition 确定窗体一次出现时的位置 Text 窗体标题栏显示的文本...)创建MDI【设置窗体:将窗体的IsMDIContainer属性设为true。...设置窗体:在调用打开窗体的Show()方法前,在代码中将窗体的MdiParent属性设为this】 例如: //用户单击菜单项时,出现创建学员用户窗口 private void tsmiNewStudent_Click...=this; addStudentForm.Show();//显示创建学员用户窗体 } (2)为窗体添加窗体列表【在窗体添加一个菜单Name(tsmiWindows),添加一个"窗口"菜单项...,设计窗体界面 (2)设置窗体DataGridView的属性 (3)填充数据集,显示数据 (4)将修改后的数据提交到数据库 (5)实现按性别筛选功能 8-5:ADO.NET小结 DataReader

    5.9K30
    领券