0

ユーザーに一連のチェックボックスをクリックして、特定の場所が関連している領域(つまり、エンターテインメント、スポーツなど)を特定してもらい、それを取得します。

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

さまざまな場所が関連している領域のさまざまなビューでこれらの値を表示している場合、次のようになります。

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

...しかし、次のように表示されます。

[u'Education', u'Food'] 

.. forループを作成してリストを調べようとすると、個々の文字が一度に1行ずつ表示されます。つまり、[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リストを何らかの方法でエンコードして文字列としてモデル フィールドに格納し、取得時にデコードしてリストを取得します。areas_relatedすべてが 1 つの列の db に格納されるため、この方法は便利ですが、1 つではなく複数の値のエンコードされた文字列が格納されるため、実際にはクエリを実行できません。

# 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 に答える