Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django中两个模型的一种形式_Python_Django_Django Crispy Forms - Fatal编程技术网

Python django中两个模型的一种形式

Python django中两个模型的一种形式,python,django,django-crispy-forms,Python,Django,Django Crispy Forms,我有两种型号:订单和订单列表 Order是标题,OrderList是相关订单的表格部分 类顺序(models.Model): 打印编号=models.PositiveIntegerField( 详细名称=“(数字”), 默认值=获取\今日\免费\打印\编号, ) # ... 其他一些领域 类订单列表(models.Model): 订单=型号。外键( 命令, 空白=假, null=False, on_delete=models.CASCADE ) item=models.ForeignKey( 项

我有两种型号:订单和订单列表
Order是标题,OrderList是相关订单的表格部分

类顺序(models.Model):
打印编号=models.PositiveIntegerField(
详细名称=“(数字”),
默认值=获取\今日\免费\打印\编号,
)
# ... 其他一些领域
类订单列表(models.Model):
订单=型号。外键(
命令,
空白=假,
null=False,
on_delete=models.CASCADE
)
item=models.ForeignKey(
项目,,
详细名称=uu(“项目”),
空白=真,
空=真,
on_delete=models.CASCADE
)
# ... 其他一些订单列表字段
问题是如何创建一个包含这两个模型的表单,并提供将订单中的订单列表位置添加到表单中的功能 并同时保存它们。

我所做的:
py-我对订单列表使用内联表单集工厂

从django.forms导入ModelForm
从crispy_forms.helper导入FormHelper
从crispy_forms.layout导入提交
from.models导入订单、订单列表
类订单(模型表单):
类元:
型号=订单
字段=[
"所有",,
]
类OrderListForm(ModelForm):
类元:
模型=订单列表
字段=[
"所有",,
]
类OrderListFormSetHelper(FormHelper):
“”“使用类将表单集显示为表”“”
定义初始化(self,*args,**kwargs):
super()
self.template='bootstrap4/table\u inline\u formset.html'
#我不确定我们是否应该在这里添加按钮
####################################################
自我添加输入(提交(“提交”、“提交”,
css_class='btn btn主偏移量4'))
views.py

@需要登录\u
def订单(请求):
template=f'{APP_NAME}/index.html'
list_helper=OrderListFormSetHelper()
list_formset=inlineformset_工厂(订单,
订单列表,
订单列表格式,)
如果request.method==“POST”:
表单=订单(request.POST,prefix=“header”)
如果form.is\u valid()和list\u formset.is\u valid():
order=form.save()
order\u list=list\u formset.save(commit=False)
订单\列表。订单=订单
订单列表。保存()
返回HttpResponseRedirect(反向('order_created'))
否则:#所有其他方法都意味着我们应该创建一个空白表单
form=OrderForm()
返回呈现(请求,模板,{'form':表单,
“列表表单”:列表表单集,
“列表辅助对象”:列表辅助对象})
index.html


{%csrf_令牌%}
{%crispy form%}
{%crispy list\u form list\u helper%}
{%translate“发送订单”%}
生成的html呈现的页面如下所示:

但是当我按下提交按钮时 它会清理与订单相关的字段并将其标记为空白

您可以使用
crispy
模板标记来呈现表单。它使用
FormHelper
类帮助呈现表单,默认情况下,属性
form\u tag
设置为
True
,从而为您呈现
form
标记。这意味着您正在嵌套不起作用且在HTML5标准中不可能的表单标记。您需要将此属性设置为
False
,以防止出现这种情况:

类订单(ModelForm):
类元:
型号=订单
字段=[
"所有",,
]
定义初始化(self,*args,**kwargs):
super()
self.helper=FormHelper(self)#显式设置helper以防止自动创建
self.helper.form_tag=False#不呈现表单标记
self.helper.disable_csrf=True#不呈现csrf令牌
接下来,在视图中创建的辅助对象中,还必须设置这些属性。此外,您所谓的
list\u formset
不是表单集的
实例,而是一个类,因此您实际上需要实例化表单集类并使用它:

@需要登录\u
def订单(请求):
template=f'{APP_NAME}/index.html'
list_helper=OrderListFormSetHelper()
list_helper.form_tag=False#不呈现表单标记
list_helper.disable_csrf=True#不呈现csrf令牌
OrderListFormSet=inlineformset\u工厂(订单,
订单列表,
订单列表格式,)
如果request.method==“POST”:
表单=订单(request.POST,prefix=“header”)
list_formset=OrderListFormSet(request.POST,instance=form.instance)#实例化formset
如果form.is\u valid()和list\u formset.is\u valid():
order=form.save()
order\u list=list\u formset.save()
#删除下面两行,已经用'form.instance'实例化了formset,并在不使用'commit=False'的情况下调用了save`
#订单\列表。订单=订单
#订单列表。保存()
返回HttpResponseRedirect(反向('order_created'))
否则:#所有其他方法都意味着我们应该创建一个空白表单
form=OrderForm()
list_formset=OrderListFormSet(instance=form.instance)#实例化formset
返回呈现(请求,模板,{'form':表单,
“列表表单”:列表表单集,
“列表辅助对象”:列表辅助对象})

是否要在forms.py???@raven404 yes I doc中的order下添加订单列表?是否可以共享您的模型文件?
Django==3.1.7
django-crispy-forms==1.11.2