从列表Django中剥离Unicode

时间:2016-06-23 12:38:26

标签: python django django-models django-views

我想从下面的列表中删除[u']。

[u'Wireless Internet', u'Air Condition', u'Wardrobe', u'Television', u'In House Movies', u'Flatscreen TV']

在我的django模板中显示以下值

Wireless Internet, Air Condition, Wardrobe 

在保存MultipleChoiceField值时发起了unicode。

模型

class MyRooms(models.Model):
  #other fields
  room_amenities=models.TextField()

  def __unicode__(self):
        return '%s, %s' % (self.room_name, self.id)

room_amenities= forms.MultipleChoiceField(choices=ROOM_CHOICES, required= False, widget=forms.CheckboxSelectMultiple)

我尝试编码为'utf-8'但由于AttributeError,它无法正常工作。我还通过编写自定义模板过滤器来迭代列表,但它不起作用。它在django模板中返回None

对于我写的自定义模板标记,

register = template.Library()

 def strip_u(value):
     thin=list(map(str, value))
     return thin

 register.filter("strip_u", strip_u)

输出

['[', 'u', "'", 'W', 'i', 'r', 'e', 'l', 'e', 's', 's', ' ', 'I', 'n', 't', 'e', 'r', 'n', 'e', 't', "'", ',', ' ', 'u', "'", 'A', 'i', 'r', ' ', 'C', 'o', 'n', 'd', 'i', 't', 'i', 'o', 'n', "'", ',', ' ', 'u', "'", 'W', 'a', 'r', 'd', 'r', 'o', 'b', 'e', "'", ',', ' ', 'u', "'", 'T', 'e', 'l', 'e', 'v', 'i', 's', 'i', 'o', 'n', "'", ',', ' ', 'u', "'", 'I', 'n', ' ', 'H', 'o', 'u', 's', 'e', ' ', 'M', 'o', 'v', 'i', 'e', 's', "'", ',', ' ', 'u', "'", 'F', 'l', 'a', 't', 's', 'c', 'r', 'e', 'e', 'n', ' ', 'T', 'V', "'", ']'] 

我该怎么做?

更新:根据Bakkal的解决方案。我这样做了:

{% for myroom in myrooms %}

<p> {{myroom.room_name}}</p>
<ul>
    {% for amenity in myroom.room_amenities  %}
        <li>{{amenity}}</li>
    {% endfor %}
</ul>
{% endfor %}

输出

[
u
'
W
i
r
e
l
e
s
s
I
n
t
e
r
n
e

1 个答案:

答案 0 :(得分:1)

  

在我的django模板中显示以下值

     

无线上网,空调,衣柜

我害怕给出的答案,因为将这种表示保存到数据库中并不是真正的实际或最佳做法,但是因为您发现Room.amenities是一个字符串: < / p>

>>> s = "[u'Wireless Internet', u'Air Condition', u'Wardrobe', u'Television', u'In House Movies', u'Flatscreen TV']"
>>> ', '.join([str(x) for x in eval(s)])
'Wireless Internet, Air Condition, Wardrobe, Television, In House Movies, Flatscreen TV'

以上采用您拥有的字符串表示形式,并给出您想要的字符串表示形式。你想要的工作,但真的不推荐。 eval()很危险,您可以查看安全隐患。

更好的方法是在保存模型时处理它,这样每次显示时都不需要处理它(不推荐,但如果你不想这样做可能是必要的)使用数据库关系或ArrayField

您使用了MultipleChoiceField,它将结果作为unicode对象列表。

因此,来自该表单字段的直接输出类似于实际列表,所以我们不要尝试将其转换为Python中的字符串。 保持原样,然后您可以处理您想要的格式

>>> amenities = [u'Wireless Internet', u'Air Condition', u'Wardrobe', u'Television', u'In House Movies', u'Flatscreen TV']
>>> ', '.join([str(x) for x in amenities])
'Wireless Internet, Air Condition, Wardrobe, Television, In House Movies, Flatscreen TV'

然后您可以将其保存到模型中

room.amenities = ', '.join([str(x) for x in amenities])
room.save()

甚至更好地探索(推荐)

您可以使用关系,您拥有Room模型,然后每个Room都会有零个或RoomAmenity个与之关联的对象。在Django Relationships上阅读更多内容。

class Room:
    ...
    amenities = models.ManyToManyField(RoomAmenity)


class RoomAmenity:
   name = CharField()
   def __unicode__(self): # use __str__ in Python 3
       return self.name

然后在模板中

{% for amenity in room.amenities %}
    {{amenity}}
{% endfor %}

您可以使用ArrayField并将每个便利设施存储为room.amenities列表字段中的元素。这可以在PostgreSQL上实现,例如,参见Django docs,您也可以使用这个数据库。

  

有没有办法让它像dis <li> wireless internet </li> <li> Air Condition </li>一样显示?希望你明白我的观点?

如果您还没准备好使用推荐的方式将设施存储为关系或列表,您还可以拉出字符串表示并从中解析项目,如下所示:

>>> 'Wireless Internet, Air Condition, Wardrobe'.split(',')
['Wireless Internet', ' Air Condition', ' Wardrobe']

现在您有一个列表,您可以将其传递给模板并迭代显示。