【问题标题】:Strip Unicode from List Django从列表 Django 中去除 Unicode
【发布时间】:2016-10-25 19:14:23
【问题描述】:

我想从下面的列表中去掉 [u']。

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

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

Wireless Internet, Air Condition, Wardrobe 

unicode 是在保存 MultipleChoiceField 值时产生的。

型号

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

【问题讨论】:

  • 您可以在这里发布您的尝试及其输出吗?
  • 是的.. 问题在于剥离 [u']。这就是我需要的。
  • 好的..如何在模板中没有重音符号的情况下显示它?
  • 您有Room 模型吗?它有amenities 字段吗?如果是,该字段的类型是什么?如果您使用了CharFieldTextField,那么可能会强制将列表类型转换为字符串。
  • 是的,我有一个房间模型,该字段是一个文本字段。我已经更新了我的问题。但我还没有得到像这样的解决方案:room.amenities = amanities。 'amanties' 是怎么来的?

标签: python django django-models django-views


【解决方案1】:

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

无线上网、空调、衣柜

我不敢给出答案,因为将这种表示形式保存到数据库中并不是真正实用或最佳实践,但由于您透露 Room.amenities 是一个字符串:

>>> 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 &lt;li&gt; wireless internet &lt;/li&gt; &lt;li&gt; Air Condition &lt;/li&gt; 一样显示?希望你明白我的意思吗?

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

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

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

【讨论】:

  • 感谢您的回复。它会像无线互联网、空调、衣柜、电视、室内电影、纯平电视一样保存。有没有办法让它像 dis
  • wireless internet
  • Air Condition
  • 那样显示?希望你明白我的意思吗?
  • @YoYo 在那里,我想我涵盖了推荐的方法和骇人听闻的方法。如果你有时间,你应该在数据库中处理关系或列出存储。希望这会有所帮助,玩得开心!
  • 感谢您的回复!我很想使用 save() 方法。但是通过视图修复它非常繁琐且不容易,因为我将不得不编辑大量代码。我在想是否可以在模型保存方法中这样做?
  • 我也在用Mysql。
  • 非常感谢您的回复。将其标记为答案,因为它解决了部分问题,但我仍然面临问题。就像我在视图中使用 ', '.join([str(x) for x inities]) 时,它适用于一个模型,而对另一个模型则失败了。我想要一种可以保存 dat 之类的便利设施并使用自定义模板标签正确过滤它的方法。那会更好。但是由于安全问题, eval() 问题不会让我这样做。但这对我来说是最好的方法。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签