【问题标题】:Django: show a ManyToManyField in a template?Django:在模板中显示 ManyToManyField?
【发布时间】:2019-09-20 12:00:48
【问题描述】:

我的 Django 项目中有这些模型:

class Area(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
    def __unicode__(self):
        return self.name
class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100, primary_key=True)
    area = models.ManyToManyField(Area,related_name='area')

如何在模板中显示地方的区域名称?目前我有:

{% for place in places %}
    Name: {{ place.name }}, Area: {{ place.area}}
{% endfor %}

给出:

Area: <django.db.models.fields.related.ManyRelatedManager object at 0x10435a3d0>

{{ place.area}} 只是空白。有人可以帮忙吗?

【问题讨论】:

    标签: django


    【解决方案1】:

    您的视图代码是什么样的?
    这是返回相关模型的一种方式:

    from myapp.models import Area, Place
    
    def detail(request, place_id):
        place = Place.objects.get(pk=place_id)
        areas = place.area.all()
    
        return render_to_response('detail.html', {
            "place": place,
            "areas": areas,
        })
    

    这个例子只是为了说明;您希望包含错误处理代码。
    您的模板可能如下所示:

    <h3>{{ place }}</h3>
    
    {% if areas %}
      <ul>
      {% for area in areas %}
        <li>{{ area.name }}</li>
      {% endfor %}
      </ul>
    {% endif %}
    

    【讨论】:

    • 谢谢!我的问题是我有另一个页面,其中包含许多地方 - 所以我无法轻松地在视图中分别计算每个地方的区域(问题已更新)。对此有何想法?
    【解决方案2】:

    在模板中使用 place.area.all
    http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

    {% for place in places %}
        Name: {{ place.name }}<br/>
        Area: <br/>{% for area in place.area.all %}{{ area }}<br/>{% endfor %}
    {% endfor %}
    

    【讨论】:

    • 更正:将第 3 行中的 places.area.all 更改为 place.area.all
    【解决方案3】:

    您可以使用现有的连接模板标签。

    https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#join

    这是代码

    {% for place in places %}
        Name: {{ place.name }}, Area: {{ place.area.all|join:", " }}
    {% endfor %}
    

    【讨论】:

      【解决方案4】:

      仅显示多对多字段:

      {% for place in places.area.all %}
          {{ place.name }}
      {% endfor %}
      

      【讨论】:

        猜你喜欢
        • 2019-08-07
        • 2014-11-22
        • 2013-09-22
        • 2012-07-04
        • 2011-01-10
        • 2019-12-22
        • 1970-01-01
        • 2019-05-24
        相关资源
        最近更新 更多