0

我有一个用户单击一系列复选框来确定某个地方与哪些区域相关(即娱乐、体育等),然后我用以下方法检索:

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

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

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

...但它显示为:

[u'Education', u'Food'] 

.. 如果我尝试创建一个 for 循环来遍历列表,则会显示每个单独的字符,一次一行。即,[u'E 等。有没有我可以用来不显示[u'等的过滤器?

任何帮助,将不胜感激。

4

1 回答 1

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 中的一列中,但是您不能真正对 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 %}
于 2012-11-17T05:57:10.217 回答