【问题标题】:Django Mptt : How to nest another ModelDjango Mptt:如何嵌套另一个模型
【发布时间】:2020-05-07 09:43:08
【问题描述】:

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

models.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 文档中引用的递归树标记。 主页.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

【问题讨论】:

  • 我不确定我是否遵循。你所拥有的有什么问题?它应该按原样工作,只需将 Customer.parent 设置为您想要的 Reseller 对象。顺便说一句,这里的 Customer 中的 parent 不是一个好名字,最好直接称呼它为 reseller
  • Tom,感谢您的回复,我将父级更改为客户中的经销商。当我运行 ``` recursettree ``` 标签时,我无法在经销商下显示客户。它只提供经销商的层次结构。我应该从视图函数中传递什么查询来获取经销商下的所有客户。
  • 是的,因为它不是树的一部分。如果您显示您拥有的递归树代码,则可以使用它提供解决方案。
  • Tom,刚刚在我的视图中添加了视图和递归标签。
  • 顺便说一句,不要使用import *,它会让人无法知道事情的来源,并且会破坏编辑器中的代码完成和其他功能,以及引入细微的错误.

标签: django django-mptt


【解决方案1】:

它不起作用的原因是因为客户不是经销商树的一部分,您需要手动获取它们。这样的事情会给你一个开始:。但是,如果客户并不总是处于领先节点,则您需要进行一些更改。

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

【讨论】:

  • 谢谢,我之前尝试过,但没有成功。我们怎样才能让客户成为树的一部分?
  • 无法完成,但这里提供的代码应该可以工作。尝试的时候有什么问题?我还注意到客户可以出现在任何地方,所以我为此修改了代码。
  • 它显示了正确的经销商层次结构,但不是客户,尽管我已经在各种经销商下填充了客户。经销商完美展示,但不是子类的项目,即客户
  • 我相信最新的代码应该正确显示层次结构,除非我遗漏了什么。如果它们确实显示,但不是您希望它们显示的方式,您需要提供更多详细信息。
  • 现在一切正常。在我的代码中,我错过了相关名称“cust_children”。非常感谢您付出的时间和努力,汤姆。 :)
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2012-10-12
  • 1970-01-01
相关资源
最近更新 更多