Django列表在模板中呈现为字符串 - 无法访问列表值

时间:2015-06-05 07:08:34

标签: django list

问题:我尝试迭代一个列表,这是在表单中选择多个项目的结果(使用forms.MultipleChoiceField)。然后使用models.Charfield将其保存在我的数据库中,并通过context_dict (context_dict['attachment'] = attachment.pieces_jointes)从视图传递到模板 但是我认为它不是保存为列表而是保存为字符串。而不是:

[u'essai document', u'essai document 2', u'essai document5'], 

我想我有(因为模型字段类型):

"[u'essai document', u'essai document 2', u'essai document5']"

的确,在我的模板中输入:

{% for attachment in attachments %}
    {{attachment.pieces_jointes.1}}
 {% endfor %}

我得到了那条记录:

u

而不是:

essai document 2

有关您的信息,如果我打开管理员并查看我记录的值:

[u'essai document', u'essai document 2', u'essai document5']

我试图摆脱可能在列表周围的可能“”,但我还没有成功。任何人都可以解释我如何将该字符串转回列表并在我的模板中迭代它? 感谢

请求的一些代码:

models.py

class Document (models.Model):
    dpseudo = models.ForeignKey(Identite)
    dnom = models.CharField(max_length=128, unique=False)
    dphoto = models.ImageField(upload_to='profile_document', blank=False)
    ddate_ajout = models.CharField(max_length=128, unique=False)
    slug = models.SlugField(unique=True)
    def save(self, *args, **kwargs):
        if not self.id:
                self.slug = slugify(self.dpseudo) + slugify(self.dnom) + slugify(self.ddate_ajout)
        super(Document, self).save(*args, **kwargs)

    def __unicode__(self):  #For Python 2, use __str__ on Python 3
        return self.dnom



class Attachment (models.Model):
    name = models.CharField(max_length=128, unique=True)
    date_creation = models.CharField(max_length=128, unique=False)
    statut = models.CharField(max_length=128, unique=False)
    pieces_jointes = models.CharField(max_length=128, unique=False)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        if not self.id:
                self.slug = slugify(self.name)
        super(Attachment, self).save(*args, **kwargs)

    def __unicode__(self):  #For Python 2, use __str__ on Python 3
        return self.name

views.py

import ast

def attacher(request):
    piece_list = Attachment.objects.all()
    attachment_list =[ast.literal_eval(i) for i in Attachment.objects.values_list('pieces_jointes', flat=True)]

    context_dict = {'pieces': piece_list, 'nom_pieces_jointes' : attachment_list}

    return render(request, 'job/attacher.html', context_dict)

forms.py

class AttachmentForm(forms.ModelForm):
    name = forms.CharField(max_length=128, help_text="Please enter the name.")
    pieces_jointes = forms.MultipleChoiceField(choices=[])

    def __init__(self, *args, **kwargs):
        super(AttchmentForm, self).__init__(*args, **kwargs)
        self.fields['pieces_jointes'].choices = [(document.dnom, document.dnom) for document in Document.objects.all()]

    class Meta:
        model = Attchment
        fields = ('name','pieces_jointes')

根据建议,我在视图中使用了ast.literal_eval(),但是我收到错误:

解析(第1行)时出现意外的EOF

1 个答案:

答案 0 :(得分:0)

如你所说,你已将attachment.pieces_jointes保存为字符串:

"[u'essai document', u'essai document 2', u'essai document5']"

您可以使用ast.literal_eval中的view来传递模板中的列表:

>>> import ast
>>> l=ast.literal_eval("[u'essai document', u'essai document 2', u'essai document5']")
>>> l[1]
u'essai document 2'