我想从下面的列表中删除[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
答案 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']
现在您有一个列表,您可以将其传递给模板并迭代显示。