为什么Django模板无法识别对象字段中的列表?

时间:2019-06-25 14:11:25

标签: django django-templates

我有一个存储列表的对象字段。 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>

3 个答案:

答案 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。谢谢大家的帮助!