显示和保存 Django ArrayField

Posted

技术标签:

【中文标题】显示和保存 Django ArrayField【英文标题】:Displaying and saving Django ArrayField 【发布时间】:2017-12-26 16:27:15 【问题描述】:

我在模型中有一个 ArrayField 类型。 my_list 的建议元素列表中的后端自动。然而,用户随后需要根据需要更新该列表。模型如下所示:

class my_model(models.Model):
    my_list = ArrayField(
        models.CharField(max_length=10)
    )

问题是当my_list 在模板中呈现时是一个带有逗号分隔列表的单个html 输入标记。例如a,b,c,d

我的问题有两个。如何让模板语言显示逗号分隔列表,以便每个元素都有自己的 html 输入框。此外,我正在努力解决的更困难的事情是如何制作它,以便将这些元素作为数组保存回模型。

我目前的想法是用 javascript 破解前端。但是有没有更好的方法来使用 Django 呢?

【问题讨论】:

您确定要为每个元素使用单独的input 吗?单个select 不是更好吗?用户如何将任何内容添加到列表中? 【参考方案1】:

例如,您可以使用名称属性“myfield”创建多个字段。然后在视图中,您可以使用 request.POST.getlist('myfield') 获取该字段的列表,您可以在循环中对其进行迭代并将其存储在数组字段中。 2 年后,但我希望这能解决你的问题。

【讨论】:

【参考方案2】:

我不知道你的确切目标是什么,但可能是这样的:

% for element in my_list %
    <div> element </div> <!--any html tag which you desire--> 
% endfor %

【讨论】:

但是当我按下保存时,它并没有正确保存回模型 你应该在这里发布你的代码,然后其他人可以提供帮助,因为现在它太模糊了,你的意图是什么【参考方案3】:

您需要创建并注册一个自定义Widget。

小部件是 Django 对 HTML 输入元素的表示。小部件处理 HTML 的呈现,以及从与小部件对应的 GET/POST 字典中提取数据。

一个将呈现多行文本区域的简单示例:

class ArrayWidget(Textarea):
    def format_value(self, value):
        if value is None or len(value) == 0:
            return None
        else:
            return '\n'.join(value.split(','))

    def value_from_datadict(self, data, files, name):
        return data.get(name).splitlines()

【讨论】:

以上是关于显示和保存 Django ArrayField的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 显示上传文件的内容(而不是保存)

如何在 django 模板中显示保存的、动态创建的图像?

在 Django Admin 中保存模型之前显示警报消息

如何使用 GeoIP2() django 模型从 IP 地址调用中提取保存的信息以显示在我的 html 中

Django-select下拉菜单的显示与保存

不使用 django 表单如何验证和保存表单数据