【问题标题】:Displaying list from getlist django显示来自 getlist django 的列表
【发布时间】:2012-11-17 05:03:43
【问题描述】:

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

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

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

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

...但是显示为:

[u'Education', u'Food'] 

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

任何帮助将不胜感激。

【问题讨论】:

  • areas_related 是如何存储的?
  • 能否也给我们看一下第二种情况的模板代码。
  • @Hamish 存储是什么意思?基本上,用户单击复选框,然后将这些值与 add=Descriptions(name=name_add,areas_related=areas_related) add.save() ... [u'等的。

标签: django


【解决方案1】:

这里可能发生的事情是将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 %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多