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 %}