为啥 Django 模板不能从对象字段中识别列表?
Posted
技术标签:
【中文标题】为啥 Django 模板不能从对象字段中识别列表?【英文标题】:Why won't Django template recognize list from object field?为什么 Django 模板不能从对象字段中识别列表? 【发布时间】:2019-11-07 09:49:21 【问题描述】:我有一个存储列表的对象字段。 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>
【问题讨论】:
您必须将其作为字符串传递 @HenryM 我认为你是对的。你知道如何将它作为列表传递吗? 显示你是如何通过的 你需要告诉我们object_field
是什么。
谢谢,我在原始帖子中添加了更多细节,以便您了解我如何将数据从视图传递到模板
【参考方案1】:
您想要显示模型中的数据,所以假设您有一个模型
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 %
【讨论】:
【参考方案2】: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:与其在SpecialField
上存储单个value_options
条目,不如删除该字段并添加第二个模型,例如@ 987654328@点赞
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
的所有选项列表。
【讨论】:
谢谢汤姆,但不确定会不会。这几乎就像有一个列表列表,您的建议只会处理外部列表。【参考方案3】:这是最方便的解决方案...使用拆分定义一个新列表。 https://***.com/a/8318915/9268133。感谢大家的帮助!
【讨论】:
以上是关于为啥 Django 模板不能从对象字段中识别列表?的主要内容,如果未能解决你的问题,请参考以下文章