显示和保存Django的ArrayField

6

我在一个模型中有一种名为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”不是更好吗?用户如何向列表中添加任何内容? - OrangeDog
3个回答

1
你需要创建并注册一个自定义 Widget

Widget是Django表示HTML输入元素的方式。Widget处理HTML的渲染以及从对应于Widget的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()

1

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

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

但是当我按保存时,它没有正确地将其保存回模型。 - Alexis
你应该在这里发布你的代码,其他人才能够帮助你,因为现在它非常模糊,不清楚你的意图是什么。 - pooya

0
你可以创建多个名为“myfield”的字段。然后在视图中,您可以使用request.POST.getlist('myfield')获取这些字段的列表,并在循环中迭代它并将其存储在数组字段中。希望这能解决你的问题(翻译时注意了一下原文中的语法错误)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接