我有一个存储列表的对象字段。 Django模板将列表像字符串一样对待,它遍历每个字符,而不是每个列表值。
试图以各种方式保存对象字段“ ['1','2']”和“ 1,2”。尝试使用“ | make_list”过滤器。
models.py
class SpecialField(models.Model):
name = models.CharField(max_length=200,blank=True,null=True)
description = models.CharField(max_length=200,blank=True,null=True)
value_options = models.CharField(max_length=200,blank=True,null=True)
# value_options might be "['1','2']" or "red, green, blue"
views.py
object_field_list= SpecialField.objects.all()
context = {
'object_field_list': object_field_list,
}
return render(request, 'app1/template-detail.html', context)
模板
{% for object_field in object_field_list%}
{% for list_value in object_field.value_options %}
<option>{{ list_value }}</option>
{% endfor %}
{% endfor %}
我希望得到:
<option>1</option>
<option>2</option>
但是我得到了:
<option>[</option>
<option>'</option>
<option>1</option>
<option>'</option>
<option>,</option>
<option>'</option>
<option>2</option>
<option>'</option>
<option>]</option>
答案 0 :(得分:0)
您要显示模型中的数据,所以假设您有一个模型
class SpecialField(models.Model):
name=models.CharField(max_length=101)
price = models.IntegerField(default=0)
鉴于您在context
中进行设置的方式,可以使用以下模板在模板中显示
{% for obj in object_field_list %}
{{ obj.name}} - {{ obj.price }}
{% endfor %}
显然,您需要为模型进行修改
根据您的建议进行调整...它需要再循环一层。仍然无法正常工作。
models.py
class SpecialField(models.Model):
name=models.CharField(max_length=101)
price = models.IntegerField(default=0)
custom_list = models.CharField(max_length=200)
模板
{% for obj in object_field_list %}
{{ obj.name}} - {{ obj.price }}
{% for list_value in obj.custom_list %}
{{ list_value }}
# this is where it's breaking for me
{% endfor %}
{% endfor %}
答案 1 :(得分:0)
context = {
'object_field_list': SpecialField.objects.values_list('value_options', flat=True),
}
应该为您提供真正想要循环显示的内容。
编辑:对不起,我错过了您存储字符串而不是使用ArrayField
或类似字符串的事实。更新后的答案中的问题是您拥有的数据不一致。如果只是所有逗号分隔的值,则可以执行以下操作:
object_field_list = [value_list.split(',') for value_list in SpecialField.objects.values_list('value_options', flat=True)]
,但是您将需要某种方式来规范存储在value_options
中的数据。数据如何进入数据库?如果是通过Django,则可以在接受数据的表单或API端点上应用某种清除方法。
试图以各种方式保存对象字段“ ['1','2']”和“ 1,2”。尝试使用“ | make_list”过滤器。
如果您完全控制传入数据,则最好使用normalizing the data:与其在value_options
上存储单个SpecialField
条目,不如删除该字段并添加一个第二个模型,例如SpecialFieldOption
之类的
class SpecialFieldOption(models.Model):
name = models.CharField(max_length=200, blank=False)
field = models.ForeignKey(SpecialField, related_name='options')
# now you can do
SpecialField.objects.get(pk=1).options.all()
遍历给定SpecialField
的所有选项的列表。
答案 2 :(得分:0)
这是最方便的解决方案...使用split定义一个新列表。 https://stackoverflow.com/a/8318915/9268133。谢谢大家的帮助!