Django Mptt:如何嵌套另一个模型



我有两种型号,经销商和客户。我可以为经销商生成树层次结构,但我想在其直接上级经销商下列出客户。

型号.py

from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
# Create your models here.
class Reseller(MPTTModel):
reseller_name = models.CharField(max_length=40)
reseller_email = models.EmailField(max_length=70,blank=True)
reseller_code = models.CharField(max_length=40)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['reseller_name']
def __str__(self):
return self.reseller_name

class Customer(models.Model):
customer_name = models.CharField(max_length=40)
customer_email = models.EmailField(max_length=70,blank=True)
customer_code = models.CharField(max_length=40)
reseller = models.ForeignKey(Reseller, on_delete=models.CASCADE, null=True, blank=True, related_name='cust_children')
def __str__(self):
return self.customer_name

这是观点:

views.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import *
from .forms import *

# Create your views here.
def index(request):
return render(request, 'main/login.html')
def home(request):
resellers = Reseller.objects.all()
customers = Customer.objects.all()
context = { 'resellers' : resellers, 'customers' : customers }
return render(request, 'main/home.html', context)

这是mptt文档中引用的递归树标记。home.html

{% recursetree resellers %}
<li>
{{ node.reseller_name }} 
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>    
{% endif %}
</li>
{% endrecursetree %}

这是我的目标订单:

reseller1
-reseller2
-customer1
--reseller3
----customer2

它不起作用的原因是因为客户不是经销商树的一部分,您需要手动获取它们。这样的事情会给你一个开始:。不过,如果客户并不总是处于领先地位,你就需要做出一些改变。

{% recursetree resellers %}
<li>
{{ node.reseller_name }}
{% if node.cust_children.all %}
<ul>
{% for customer in node.cust_children.all %}
<li>{{ customer.customer_name }}</li>
{% endfor %}
</ul>
{% endif %}
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}

相关内容

最新更新