Django动态名称属性和在views.py

时间:2016-01-25 17:39:59

标签: jquery django forms django-templates django-views

我在Django中使用TemplateView创建了一个表单,我不得不使用大量的JavaScript来使表单生成动态。我所做的是使用户可以通过单击Add More Software按钮添加多个带有相关信息的软件包,然后为每个输入为该表单组生成新的id和name属性,例如:

<input id="software-name-1" name="software-name-1" type="text">

当单击添加软件按钮时,有一段JavaScript克隆并添加与表单相同的表单组,但随后将id和名称设置为software-name-2。我也有它,所以你可以删除表单组。但是现在,如果表单组被删除,其后的其他组仍然可以拥有software-name-3的ID,而software-name-2可能不再存在,因为它已在submit之前删除按钮被按下了。因此,当表单POST我可以software-name-1时,software-name-3之后。

在views.py中获取和使用该数据的最佳方法是什么?我尝试以for software_name in request.POST['software-name-' + str(count)]:的格式进行计数,但是如果跳过software-name-[whatever the number],这当然不起作用。

以下是我更改ID和名称属性的jQuery代码:

$(document).on('click', '#add-software-btn:last', function() {
    // Find last software container
    var $div = $('div[id^="software-container"]:last');
    console.log($div);
    //counter
    var num = parseInt($div.prop("id").match(/\d+/g), 10) + 1;
    // Clone the original software container inside the click function
    var $software_container_copy = $software_container_original_copy.clone(true)
        .prop('id', 'software-container-' + num);

    // Rename form id, for and name attributes
    $software_container_copy.find('label[for^="software-name"]:last')
        .attr('for', 'software-name-' + num);
    $software_container_copy.find('input[id^="software-name"]:last')
        .attr('id', 'software-name-' + num)
        .attr('name', 'software-name-' + num);
});

同样,用户可以选择在发布表单之前删除他们添加的软件,这样就会弄乱Django在视图中使用的名称的顺序。在views.py中获取此数据的最佳方法是什么?除了软件名称之外还有其他输入值,因此保持每个设置值特定于用户添加的软件是至关重要的,这就是为什么我必须生成唯一的名称和ID而不是仅仅通过列表。我将所有这些数据放在一个JSON文件中。也许这可以首先使用JavaScript完成,并作为一个软件名称下的对象发送到视图。这个问题的主要问题是我不能使用计数,但我必须搜索包含`software-name - &#39;的所有POST数据。并将其与其下的数据一起使用。我不知道。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

对象request.POST的行为类似于字典,因此您可以轻松地遍历密钥并保留所需的密钥。

例如:

input_names = [name for name in request.POST.keys() if name.startswith('software-name-')]
for input_name in input_names:
    soft_name = request.POST[input_name]

您甚至可以直接获取元组(名称,值),如下所示:

inputs = [(n, v) for n, v in request.POST.iteritems() if n.startswith('software-name-')]