我让用户点击一系列复选框来确定某个地方与哪些区域相关(即娱乐,体育等),然后我会检索这些区域:
areas_related=request.POST.getlist('areas_related')
当我在不同的视图中显示这些值时,不同的地方与我正在使用的区域相关:
{% for service in services %}
{{service.areas_related}}
{% endfor %}
...但它显示为:
[u'Education', u'Food']
..如果我尝试让for循环遍历列表,则每个单独的字符一次显示一行。即, [ ü “ Ë 是否有一个过滤器我可以用来不显示[u'等?
任何帮助将不胜感激。
答案 0 :(得分:2)
这里可能会发生的是您将areas_related
存储为字符串。
所以你可能有一个像这样的模型:
class Service(models.Model):
...
areas_related = models.CharField(max_length=<length_here>)
然后在视图中执行此操作:
def foo_view(request, ...):
...
service = <retrieve Service here>
areas_related = request.POST.getlist('areas_related')
service.areas_related = areas_related
service.save()
...
所以这里发生的是request.POST.getlist('areas_related')
返回一个Python列表。但是,您将该值存储到模型的字符串字段中。结果,Django尝试将给定列表转换为字符串,然后将其存储在数据库中;当您将Python列表转换为字符串时,结果是列表的字符串表示形式:
>>> a = [u'foo', u'foo2']
>>> unicode(a)
u"[u'foo', u'foo2']"
要解决此问题,您可以执行以下操作之一:
外键
不是将所有areas_related
存储为模型中的单个字段,而是将它们存储为外键。我认为这是一种更好的方法,因为那时你可以进行SQL聚合,与下一种方法相比,它被认为更灵活。
# models.py
class AreaRelated(models.Model):
service = models.ForeignKey('Service', related_name='areas_related')
areas_related = models.CharField(max_length=<length_here>)
class Service(models.Model):
...
# views.py
def foo_view(request, ...):
...
service = <retrieve Service here>
areas_related = request.POST.getlist('areas_related')
for a in areas_related:
service.areas_related.create(areas_related=a)
...
# template
{% for service in services %}
{% for area_related in service.areas_related.all() %}
{{ area_related }}
{% endfor %}
{% endfor %}
编码字符串
通过以某种方式对其进行编码,将列表作为字符串存储在areas_related
模型字段中,然后在检索解码中获取列表。这个方法很好,因为所有内容都存储在db中的一列中,但是你不能真正对areas_related
进行任何查询,因为它会存储多个值的编码字符串而不是一个。
# models.py
import json
class Service(models.Model):
...
areas_related = models.CharField(max_length=<length_here>)
def get_areas_related(self):
return json.loads(self.areas_related)
# views.py
import json
def foo_view(request, ...):
...
service = < retrieve Service here>
areas_related = request.POST.getlist('areas_related')
service.areas_related = json.dumps(areas_related)
service.save()
...
# template
{% for service in services %}
{% for area_related in service.get_areas_related %}
{{ area_related }}
{% endfor %}
{% endfor %}