附加 django 模板块

Posted

技术标签:

【中文标题】附加 django 模板块【英文标题】:Append django template block 【发布时间】:2016-01-06 02:59:15 【问题描述】:

我有 2 个模板。

-Main layout
   -create_device(template 1)
        -add_device(template 2)
        -add_device(template 2)
        -add_device(template 2)

所以我有一个create_device 布局,它是一个模板,然后是一个add_device 模板。我想要做的是每次用户点击“添加设备”时我想附加一个add_device 模板。

我的页面是什么样子的:

每个白色矩形都是一个add_device 模板。我尝试使用积木 但是,当我单击“添加设备”时,它每次都会覆盖我的块并且不会附加。它还删除了我的标题:

我尝试在我的 add_device 模板中添加 block.super

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>

编辑,我需要附加模板的原因是因为每个模板包含 1 个表单和 1 个表单集,我可以轻松地生成表单我的视图,而不是使用 jquery 来解析和更改 id 和 name 属性

表格:

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',)
            

型号:

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'

查看:

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)

【问题讨论】:

所以你想在用户每次点击Add Device时在第二部分添加一行(带有Register Name)? 我想创建一个完整的副本。我将添加我的表单,以便您查看我的寄存器与我的设备的关系 【参考方案1】:

在 django 中有formset,这绝对是你想要的。 formset 所做的是动态创建/更改/删除项目列表。因此,您应该查看原始文档:https://docs.djangoproject.com/en/1.8/topics/forms/formsets/,而不是进行模板继承。在这里很难给你一个具体的例子,但是谷歌搜索 django formset 会给你很多。

【讨论】:

哦,我知道表单集,但是它们的问题是,在这种情况下,我需要嵌套的表单集,而我找不到让它们工作的方法。这也是我的错,我发布的图片仅显示 1 个表单,在最右侧有一个菜单图标,它显示了附加到我的表单的表单集的下拉列表。原因是简单的设备可以有多个寄存器,所以我为每个设备使用一个表单集 我看到了您更新的问题,但我不清楚您希望您的页面实现什么行为。从您的第一张图片中,您是否有一个部分仅显示一个要填写的条目(具有名称、端口等的条目)和另一个部分添加用户想要的尽可能多的表单?这两个部分是否相关?第一部分总是只有一个条目吗? 第一张图片是从数据库中填充的模板,如果用户想要添加另一个空表单,我想要我的模板。 MY 模板由 1 个设备表单和动态数量的注册表单(formset)组成。当我希望用户能够动态添加新的设备表单(带寄存器)时。因此,为什么第二张图片只显示 1 行寄存器,因为它是一个空的供他们填写 你看过这个问题吗? ***.com/questions/20894629/… 我有,还在想办法应用它

以上是关于附加 django 模板块的主要内容,如果未能解决你的问题,请参考以下文章

在 jquery 中附加 Django 模板标签

DJANGO:在模板中显示多对多的附加字段

如何使用 jQuery 和 Django 分页附加数据页面?

Django 在 OpenShift 上将斜杠附加到静态文件 URL

Vuetify 滑块附加插槽文本字段未与滑块对齐

附加文本块的副本