2014-09-27 100 views
0

我在我的項目中有以下模型(在我的項目中,一個站點可以有許多支付處理器和一個支付處理器(Paypal,Payza等)可以屬於許多站點)。在Django的模板中顯示ManyToManyField

# Models.py 
class Sites(models.Model): 
    name = models.CharField(max_length=75) 
    link = models.CharField(max_length=150) 
    description = models.TextField(blank=True, null=True) 

    def __str__(self): 
     return self.name 

class PaymentProcessors(models.Model): 
    name = models.CharField(max_length=75) 

    def __str__(self): 
     return self.name 

class Sites_PaymentProcessors(models.Model): 
    site = models.ManyToMany(Sites) 
    payment_processor = models.ManyToMany(PaymentProcessors) 

查看:

# View 
def home(request): 
site_list = Sites.objects.order_by('-date_launched') 
processors_list = PaymentProcessors.objects.all() 
return render_to_response('index.html', {'site_list': site_list, 
              'payment_processors_list': processors_list}, 
              RequestContext(request)) 

模板

# Template 
{% for site in site_list %} 
    {% for payment_processor in payment_processors_list.site.all %} 
      {{ payment_processor }} 
    {% endfor %} 
{% endfor %} 

我想,以顯示它屬於一個特定站點的所有付款處理器。我試圖使用過濾器,但我無法做到這一點。我是Django的新手,我嘗試閱讀文檔並在StackOverflow上看到一些答案,但我不確定要做什麼才能正常工作。

回答

1

你不需要在你的模型中的中間表,Django會在幕後爲你構建。

#models.py 
class PaymentProcessor(models.Model): 
    name = models.CharField(max_length=75) 

    def __str__(self): 
     return self.name 

class Site(models.Model): 
    name = models.CharField(max_length=75) 
    link = models.CharField(max_length=150) 
    description = models.TextField(blank=True, null=True) 
    payment_processors = models.ManyToManyField(PaymentProcessor, null=True, blank=True) 

    def __str__(self): 
     return self.name 

然後在視圖中,您只需要拿到site_list,因爲你可以從網站對象獲得付款處理器:

#views.py 
def home(request): 
    site_list = Site.objects.all() 
    return render(request, 'index.html', 
     {'site_list': site_list}) 

最後在模板中,你通過與多對多對象循環全功能,並有你有!

#index.html 
{% for site in site_list %} 
    {{ site }}: 
    {% for p in site.payment_processors.all %} 
     {{ p }} 
    {% endfor %} 
{% endfor %}