[英]Django Models Field.E340 : ManytoMany relationship same intermediate table name in 2 different apps
[英]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
关系的复数形式。 毕竟,它是两侧的Area
和Place
的集合,所以areas
和places
。
现在,要在模板中呈现ManyToMany
字段,您可以这样做(考虑到您的视图返回了一个名为area
的Area
实例:
<h1>Currect area: {{ area.name }}</h1>
<h2>Places:</h2>
<ul>
{% for place in area.places.all %}
<p>{{ place.name }}</p>
{% endfor %}
</ul>
我们有两种方法可以在模板中显示m2m字段数据。
如果要显示与某个区域相关的所有位置; 看@Vitor的答案。
如果要显示与单个地点相关的所有区域; 见下文 -
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.