我的项目中有以下模型(在我的项目中,一个站点可以有多个支付处理器,一个支付处理器(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上看到一些答案,但我不确定我必须做些什么才能正常工作。
答案 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 %}