簡體   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