【问题标题】:Submiting variable number of forms in Django在 Django 中提交可变数量的表单
【发布时间】:2018-04-07 21:19:13
【问题描述】:

所以我正在为一家钢铁酸洗厂开发一个基于网络的工艺模拟器。 我在同一个模板上有 6 种不同类型的表单(来自 6 个不同的模型),它们都应该由同一个按钮提交。以下是对我的问题很重要的模型:

class Settings(models.Model):
    simulation = models.ForeignKey(Simulation, on_delete=models.CASCADE)
    final_time = models.IntegerField(default=3000)
    time_steps = models.IntegerField(default=50)
    film_thickness = models.FloatField(default=0.001)
    plate_thickness = models.FloatField(default=0.0005)
    plate_width = models.FloatField(default=10.0)
    number_of_pickling_tanks = models.PositiveSmallIntegerField(default=4)
    number_of_rinsing_tanks = models.PositiveSmallIntegerField(default=4)
    coil_temperature = models.FloatField(default=373.0)
    system_pressure = models.FloatField(default=100000.0)
    total_vaporization = models.FloatField(default=0.005)
    plate_velocity = models.FloatField(default=3.0)


class PicklingTank(models.Model):
    settings = models.ForeignKey(Settings, on_delete=models.CASCADE)
    number = models.PositiveSmallIntegerField()
    volume = models.FloatField(default=30)
    concentration_hcl_initial = models.FloatField(default=180.84)
    concentration_fecl2_initial = models.FloatField(default=11.35)
    concentration_fecl3_initial = models.FloatField(default=5.81)
    temperature_initial = models.FloatField(default=323.15)
    hasextinlet = models.BooleanField(default=False)

所有这些都是如下形式的:

class SettingsForm(forms.ModelForm):
    class Meta:
        model = Settings
        fields = '__all__'


class PicklingTankForm(forms.ModelForm):
    class Meta:
        model = PicklingTank
        fields = '__all__'

我已经研究过如何只用一个按钮提交多个表单 (django submit two different forms with one submit button),但我的问题完全不同:

PicklingTankForms 的数量根据用户在 Settings.number_of_pickling_tanks 中输入的值动态变化(我正在使用我的 views.py 渲染 PicklingTankForm 的一个实例,并使用 JS 在“输入时”复制它)。

如果我不知道用户要选择多少个 PicklingTankForms,我怎么能在他按下 Submit 时为每个 PicklingTankForm 创建一个 PicklingTank 实例?

谢谢!

【问题讨论】:

  • 这正是表单集的用途。

标签: python django forms dynamic submit


【解决方案1】:

使用formsets

如果您将 ModelForm 更改为 Form

from django import forms
class PicklingTankForm(forms.Form):
    ...

然后您可以使用formset 来利用自定义数量的表单

from django.forms import formset_factory
PicklingTankFormSet = formset_factory(PicklingTankForm, 
                              extra=Settings.number_of_pickling_tanks)

然后您可以遍历表单集以呈现表单。

formset = PicklingTankFormSet()
for form in formset:
    ... # render

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2015-10-22
    • 1970-01-01
    • 2015-06-02
    • 2012-07-07
    • 2011-11-26
    • 2023-03-30
    • 2015-07-31
    • 2012-06-19
    相关资源
    最近更新 更多