繁体   English   中英

当模型在不同的应用程序中时,ManytoMany字段django模板

[英]ManytoMany field django template when models are in different apps

我的问题与类似。 我有2个与m2m字段链接的模型,我想在模板中渲染该字段。 当我的2个模型在不同的应用程序中时,我该怎么做:

apps/qapp/models

class Area(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
    def __unicode__(self):
        return self.name

apps/worksheets/models

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

正如schwobaseggl所提到的那样,你的模型在不同的应用程序中的事实并没有什么不同。 通过ManyToMany关系连接的渲染字段应该几乎相同。

如果我理解正确,问题是你没有使用related_name ,你共享的代码片段实际上并不是你真正的代码。

但仅仅为了完整起见,以防有人在将来发现这个问题:

使用related_name不是必需的。 如果ManyToMany关系定义为:

class Place(models.Model):
    # ...
    area = models.ManyToManyField('qapp.Area')

Area实例中,您可以像这样导航:

area = Area.objects.get(pk=1)
places = area.place_set.all()

因为Django会自动添加反向关系%(model_name)_set 如果设置了related_name ,它将覆盖默认名称。

最后,为了增强代码的可读性,与Area模型的关系会更好:

class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100, primary_key=True)
    areas = models.ManyToManyField('qapp.Area', related_name='places')

使用ManyToMany关系的复数形式。 毕竟,它是两侧的AreaPlace的集合,所以areasplaces


现在,要在模板中呈现ManyToMany字段,您可以这样做(考虑到您的视图返回了一个名为areaArea实例:

<h1>Currect area: {{ area.name }}</h1>
<h2>Places:</h2>
<ul>
  {% for place in area.places.all %}
    <p>{{ place.name }}</p>
  {% endfor %}
</ul>

我们有两种方法可以在模板中显示m2m字段数据。

  1. 如果要显示与某个区域相关的所有位置; 看@Vitor的答案。

  2. 如果要显示与单个地点相关的所有区域; 见下文 -

places的查询集place1 = Place.objects.filter(id=1)

现在在模板中

{% for place2 in place1 %}

    {% for area1 in place2.area.all %}

        <p>{{area1.name}}</p>

    {% endfor %}

{% endfor %}

我故意采取上面的变量,以便新的人可以理解在哪里放哪个变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM