为啥 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 模板不能从对象字段中识别列表?的主要内容,如果未能解决你的问题,请参考以下文章

Django模板:从模型查询集对象中提取字段

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

django:为啥在模板中获取模型的 .id 字段很慢?

如何根据 django 模板中的日期过滤列表

Django将对象列表传递给模板

为啥我不能将用户定义的设置作为变量包含在 Django 模板中?