I have 2 templates.
-Main layout
-create_device(template 1)
-add_device(template 2)
-add_device(template 2)
-add_device(template 2)
So I have a create_device
layout that is a template and then an add_device
template. What I'm trying to do is every time a user clicks on "Add Device" I want to append an add_device
template.
each white rectangle is an add_device
template. I tried to use blocks
however when I click on "Add Device" it overwrites my block every time and doesn't append. Also it removes my title :
I've tried adding {{ block.super }} inside my add_device
template
create_device:
{% block modbus-device %}
{% endblock %}
add_device:
{% extends "app/create_modbus.html" %}
{% block modbus-device %}
<div class="panel panel-default" id="dev_{{ total_forms }}">
<div class="panel-body">
.....
</div>
</div>
Edit, the reason I need to append a template is because each template contains 1 form and 1 formset which I can easily generate form my view rather than using jquery to parse and changed id's and name attributes
Forms:
class ModbusRegistersForm(ModelForm):
ixIOType = ModelChoiceField(queryset=IOType.objects.all())
ixIOType.widget = Select(attrs={'class': 'form-control', 'data-form': '0'})
bRange = BooleanField(required=False)
bRange.widget.attrs['data-form'] = 0
class Meta:
model = Register
fields = ['sRegisterName','iStartingAddr','bRange','ixIOType','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 = ['ixModbusDevice', 'sModbusName','iPort', 'iSlave', 'sIP']
widgets = {
'sModbusName': TextInput(attrs={'placeholder': 'Device Name','class': 'form-control','data-form': '0',}),
'iPort': TextInput(attrs={'placeholder': 'Port','class': 'form-control','data-form': '0',}),
'iSlave': TextInput(attrs={'placeholder': 'Slave id','class': 'form-control','data-form': '0',}),
'sIP': TextInput(attrs={'placeholder': 'Modbus IP address','class': 'form-control','data-form': '0',})
}
Models:
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'
#Modbus tables
class Register(models.Model):
ixRegister = models.AutoField(primary_key=True)
sRegisterName = models.CharField(max_length=100)
iStartingAddr = models.IntegerField()
bRange = models.BooleanField(default=False)
ixIOType = models.ForeignKey(IOType)
ixModbusDevice = models.ForeignKey(ModbusDevice)
iOffset = models.IntegerField(blank=True, null=True)
class Meta:
db_table = 'TRegister'
view:
devices = []
modbus_qset = ModbusDevice.objects.all()
if modbus_qset:
for index, device in enumerate(modbus_qset):
container = ModbusContainer()
modbus_form = CreateModbusForm(instance=device, prefix="modbus-id_" + str(device.pk))
container.modbus_device = modbus_form
register_qset = Register.objects.filter(ixModbusDevice=device)
if register_qset:
InlineFormset = inlineformset_factory(ModbusDevice, Register, ModbusRegistersForm, extra=0)
register_forms = InlineFormset(instance=device, queryset=register_qset, prefix="register-id_" + str(device.pk))
container.registers = register_forms
else:
InlineFormset = inlineformset_factory(ModbusDevice, Register, ModbusRegistersForm, extra=1)
register_forms = InlineFormset(prefix="register-id_" + str(device.pk))
container.registers = register_forms
total_forms = index+1
devices.append(container)