显示来自getlist django的列表

时间:2012-11-17 05:03:44

标签: django

我让用户点击一系列复选框来确定某个地方与哪些区域相关(即娱乐,体育等),然后我会检索这些区域:

    areas_related=request.POST.getlist('areas_related')

当我在不同的视图中显示这些值时,不同的地方与我正在使用的区域相关:

                    {% for service in services %}
                    {{service.areas_related}}
                    {% endfor %}

...但它显示为:

[u'Education', u'Food'] 

..如果我尝试让for循环遍历列表,则每个单独的字符一次显示一行。即,          [          ü          “          Ë 是否有一个过滤器我可以用来不显示[u'等?

任何帮助将不胜感激。

1 个答案:

答案 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 %}