![](/img/trans.png)
[英]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.