Django模型表单集显示数据库数据而不是空表单集

Posted

技术标签:

【中文标题】Django模型表单集显示数据库数据而不是空表单集【英文标题】:Django model formset displaying db data instead of empty formset 【发布时间】:2015-12-19 16:46:08 【问题描述】:

我正在使用模型表单集来允许用户将重复的表单动态添加到表中(modbus 寄存器,因为设备可以有多个寄存器)。

我遇到的问题是,一旦我保存表单集(存储到 db),当我回到同一页面以创建带有寄存器的新设备时,django 会呈现所有先前创建的表单,而不是仅 1空表单(然后能够向其中添加表单)。

这是在我的表单集中创建 3 个表单后的示例(存储在 db 中):

它应该是这样的:

它应该只在我的表单集中显示 1 个空表单,然后用户可以动态添加表单。

我的看法:

def create_modbus_view(request):
    modbus_device = CreateModbusForm()
    RegisterFormset = modelformset_factory(Register, form=ModbusRegistersForm)
    register_forms = RegisterFormset()

    return render(
        request,
        'app/create_modbus.html',
        context_instance = RequestContext(request,
        
            'title':'Create Modbus Device',
            'tag': 'create_modbus',
            'modbus_device': modbus_device,
            'register_forms': register_forms
        )
    )

型号:

class Register(models.Model):
    ixRegister = models.AutoField(primary_key=True)
    sRegisterName = models.CharField(max_length=100)
    iStartingAddr = models.IntegerField()
    bRange = models.BooleanField(default=False)
    ixRegisterType = models.ForeignKey(RegisterType)
    iOffset = models.IntegerField(blank=True, null=True)

    class Meta:
        db_table = 'TRegister'

class ModbusDevice(models.Model):
    ixModbusDevice = models.AutoField(primary_key=True)
    sModbusName = models.CharField(verbose_name='Device Name',max_length=100)
    iPort = models.IntegerField(verbose_name='Port')
    iSlave = models.IntegerField(verbose_name='Slave ID')
    sIP = models.GenericIPAddressField(verbose_name='IP Address')

    class Meta:
        db_table = 'TModbusDevice'

表格:

class ModbusRegistersForm(ModelForm):
    ixRegisterType = ModelChoiceField(queryset=RegisterType.objects.all()),
    bRange = BooleanField(required=False)
    bRange.widget.attrs['data-form'] = 0
    class Meta:
        model = Register
        fields = ['sRegisterName','iStartingAddr','bRange','ixRegisterType','iOffset']
        widgets = 
                'sRegisterName': TextInput(attrs='placeholder': 'Register Name','class': 'form-control', 'data-form': '0'),
                'iStartingAddr': TextInput(attrs='placeholder': 'Starting address','class': 'form-control','data-form': '0'),
                'iOffset': TextInput(attrs='placeholder': 'Address offset','class': 'form-control','data-form': '0'),
            


class CreateModbusForm(ModelForm):
    class Meta:
        model = ModbusDevice
        fields = ['sModbusName','iPort', 'iSlave', 'sIP']
        widgets = 
                'sModbusName': TextInput(attrs='placeholder': 'Device Name','class': 'form-control','id': 'device-name',),
                'iPort': TextInput(attrs='placeholder': 'Port','class': 'form-control','id': 'port',),
                'iSlave': TextInput(attrs='placeholder': 'Slave id','class': 'form-control','id': 'slave-id',),
                'sIP': TextInput(attrs='placeholder': 'Modbus IP address','class': 'form-control','id': 'ip-address',)
            

【问题讨论】:

我认为这是表单集的默认操作。表单集总是显示您之前保存的所有条目的原因是因为用户可能想要编辑旧数据,或者他们只是想删除它们。如果您只关心添加条目,您可能还需要其他东西。 等等,很抱歉我错过了一些东西,但是您没有将现有数据作为查询集传递给表单集,它不应该在表单集中显示现有条目。这就是你的确切观点吗? 那是我的观点的确切代码。我只是通过RegisterTypes,因为我需要那些来填充下拉列表 只是想知道如果您只想要底部的一行,为什么还要使用表单集? 因为我需要它是动态的。它应该从 1 个表单开始,但用户可以单击“添加行”,这会将表单附加到列表中,他们可以添加任意数量的表单 【参考方案1】:

这似乎有效 django modelformset_factory sustains the previously submitted data even after successfully created the objects

似乎我只需要阻止它查询我的表

【讨论】:

以上是关于Django模型表单集显示数据库数据而不是空表单集的主要内容,如果未能解决你的问题,请参考以下文章

Django 和空表单集是有效的

Django:正确显示表单集错误

如何检测表单集在模板中是不是有任何错误?

使用模型表单集时如何呈现文本框而不是选择框

Django:将字段添加到模型表单集

带有内联表单集的 Django 表单验证