gpt4 book ai didi

python - 一个 html 表单,几个相互关联的 django 表单 - 如何保存?

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:01 32 4
gpt4 key购买 nike

有一个问题,我需要用一个 html 表单提交两个相互关联的模型表单。我知道如何提交两个单独的表格,但是在相关模型表格的情况下外键让我发疯。

问题是,第二个表单应该用外键填充字段到第一个表单的实例。

在这种特殊情况下,我决定合并两个模型,但我认为,在某些情况下,所描述问题的解决方法会很有用。

请考虑以下代码:

模型:

from django.db import models

class Facility(models.Model):
name = models.CharField(max_length=255)

class FacilityDetail(models.Model):
some_details = models.CharField(max_length=255)
facility = models.ForeignKey(Facility)

对应的django表单:

from django import forms

class FacilityForm(forms.ModelForm):

class Meta:
model = Facility
fields = ('name')

class FacilityDetailForm(forms.ModelForm):

class Meta:
model = FacilityDetail
fields = ('some_details', 'facility')

查看以处理表单:

from django.views.generic import View

FACILITY_PREFIX = 'facility'
FACILITY_DETAIL_PREFIX = 'facility_detail'

class FacilityCreateView(View):

def get(self, request, *args, **kwargs):
facility_form = FacilityForm(prefix=FACILITY_PREFIX)
facility_detail_form = FacilityDetailForm(prefix=FACILITY_DETAIL_PREFIX)

context = {
'facility_form': facility_form,
'facility_detail_form': facility_detail_form,
}

return render(request, 'facility_create.html', context)

def post(self, request, *args, **kwargs):
facility_form = FacilityForm(request.POST, prefix=FACILITY_PREFIX)
facility_detail_form = FacilityDetailForm(request.POST, prefix=FACILITY_DETAIL_PREFIX)

if facility_form.is_valid():
facility = facility_form.save()

# is not valid, because there is no `facility`
if facility_detail_form.is_valid():
facility_detail_form.cleaned_data['facility'] = facility

facility_detail_form.save()

return redirect(...)

context = {
'facility_form': facility_form,
'facility_detail_form': facility_detail_form,
}

return render(response, 'facility_list.html', context)

我应该如何在 FacilityCreateView.post 中处理表单验证和保存?

最佳答案

解决此问题的一种方法是:

facility_detail_form.cleaned_data['facility'] = facility

可以替换为:

facility_detail = facility_detail_form.save(commit=False)
facility_detail.facility = facility
facility_detail.save()

#rest of the code.. .

在这里commit=False creates对象,而不将其保存到数据库中,您可以在保存前分配外键对象。

关于python - 一个 html 表单,几个相互关联的 django 表单 - 如何保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30329804/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com