2015-06-05 79 views
0

Django的新功能,请随身携带。在模板中呈现为字符串的Django列表 - 无法访问列表值

问题:我尝试遍历一个列表,这是选择窗体中多个项目的结果(使用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(),但我得到一个错误:

意外EOF在解析(1号线)

+0

你能告诉我们一些代码? – Wtower

回答

0

至于你说你已经保存attachment.pieces_jointes为字符串:

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

您可以使用ast.literal_evalview通过模板列表:

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