在Django中的模板中显示ManyToManyField

时间:2014-09-27 04:22:09

标签: django database django-models django-templates django-views

我的项目中有以下模型(在我的项目中,一个站点可以有多个支付处理器,一个支付处理器(Paypal,Payza等)可以属于许多站点。)

# 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 个答案:

答案 0 :(得分: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})

最后在模板中,使用all函数循环遍历ManyToMany对象,然后就可以了!

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