Django 动态名称属性并在views.py 中获取值

Posted

技术标签:

【中文标题】Django 动态名称属性并在views.py 中获取值【英文标题】:Django Dynamic name attribute and getting values in views.py 【发布时间】:2016-05-02 03:02:10 【问题描述】:

我在 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 完成,然后作为一个软件名称下的对象发送到视图。主要问题是我不能使用计数,但我必须搜索所有包含“软件名称-”的 POST 数据并将其与属于它的数据一起使用。我不知道。有什么想法吗?

【问题讨论】:

github.com/elo80ka/django-dynamic-formset @ShangWang - 这对表单集来说很不错,但是当你不知道有多少或不知道表单集到底是什么时,它确实不能回答我关于如何在视图中使用它们的问题唯一名称属性中的前一个数字将是。我查看了文档,唯一的例子是你是否已经知道你的前缀是什么以及有多少。 Django formset 旨在处理您可以拥有的动态数量的表单。我共享的链接只是为您处理添加/删除表单的前端部分。我承认使用该工具并不是那么简单(可能有比我提供的更好的工具),但我认为首先检查 django formset 文档是值得的。这绝对是你应该使用的东西。 不,我同意,在前端处理动态表单集很好。但是在后端处理它们是我需要帮助的。我确实阅读了文档。 关于如何创建表单集将是一个很长的答案,但我想你可以用谷歌搜索它。我随机选择了一个链接,希望对你有帮助:whoisnicoleharris.com/2015/01/06/… 【参考方案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-')]

【讨论】:

这并没有直接回答我的问题,但它确实让我走上了正确的轨道并使用了其中的一部分。非常感谢您的帮助。

以上是关于Django 动态名称属性并在views.py 中获取值的主要内容,如果未能解决你的问题,请参考以下文章

Django视图层(views.py)

django导入 views.py

Django views.py 版本的 SQL Join 与多表查询

为啥我的 django 模板无法识别我在 views.py 文件中设置的 url 参数?

Django之views.py详解

Django之视图Views