django-改变自动和动态更改层次结构的方式,以响应url中的当前get参数

时间:2017-04-17 13:25:40

标签: python django django-mptt

我想使用Django-mptt制作像the sidemenu in Gumtree这样的过滤系统。

我有这样的层次结构:

g1
  --g11
    --g111
    --g112
  --g12
    --g121
    --g122
g2
  --g21
    --g211
    --g212
  --g22
    --g221
    --g222

当您访问我的网站时,您可以看到

g1
g2

它仅显示没有父级的顶级类别。我可以这样写:

nodes = Genre.objects.filter(level=0)

然后,例如,当您单击g1的链接时,层次结构会发生如下变化:

g1
  --g11
  --g12

我可以这样写:

nodes = Genre.objects.filter(tree_id=1).filter(level__lte=1)

然后,如果你点击g11,就会这样显示:

g1
  --g11
    --g111
    --g112

但我不知道如何写下代码来表达它。 如果我这样写:

nodes = Genre.objects.filter(tree_id=1)

它显示:

g1
  --g11
    --g111
    --g112
  --g12
    --g121
    --g122

但我不想展示g12,它的孩子:g121和g122。

你可以教我吗?

我想了解自动和动态更改层次结构的方法,以响应url中的当前get参数。 例如,当我们得到参数" g1"在网址目前喜欢"?genre = g1",我们将在下面看到如上所述:

g1
--g11
--g12

如果我们有"?genre = g12",

g1
  --g12
    --g121
    --g122
像这样。

另一个代码在这里:

{% load mptt_tags %}
<ul>
    {% recursetree nodes %}
        <li>
            <a href="?{% url_replace request 'genre' node.pk %}">{{ node.name }}</a>
            {% if not node.is_leaf_node %}
                <ul class="children">
                    <a href="?{% url_replace request 'genre' children.pk %}">{{ children }}</a>
                </ul>
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>

class Genre(MPTTModel):
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True)
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

    class MPTTMeta:
        order_insertion_by = ['name']

我之前制作了这个过滤系统:

class Location(models.Model):
    parent = models.ForeignKey('Location', related_name='children', null=True, blank=True)
    name = models.CharField(max_length=255)

    @property
    def dispatch(self):
        if not self.parent:
            return self
        else:
            return self.parent

    def __str__(self):
        return self.name

location_pk = request.GET.get('location')

if location_pk:
    location = get_object_or_404(Location, pk=location_pk)
    if not location.parent and location.children.exists():
        c.update({
            'state': location.dispatch,
            'regions': location.children.all(),
        })
    elif location.parent and location.children.exists():
        c.update({
            'state': location.dispatch,
            'region': location,
        })
    elif location.parent and not location.children.exists():
        c.update({
            'state': location.dispatch.parent,
            'region': location.parent,
        })
else:
    c.update({'states': Location.objects.filter(parent__isnull=True)})

<p>[ Location ]</p>
<ul>
    {% if request.GET.location %}
       <li><a href="{% url_remove request 'location' %}">All Locations</a></li>
    {% endif %}
    {% if state %}
        <li><a href="?{% url_replace request 'location' state.pk %}">{{ state.name }} | {{ state.pk }}</a></li>
        {% if region %}
            <li>---<a href="?{% url_replace request 'location' region.pk %}">{{ region.name }} | {{ region.pk }}</a></li>
            {% for city in region.children.all %}
            <li>------<a href="?{% url_replace request 'location' city.pk %}">{{ city.name }} | {{ city.pk }}</a></li>
            {% endfor %}
        {% else %}
            {% for region in regions %}
                <li>---<a href="?{% url_replace request 'location' region.pk %}">{{ region.name }} | {{ region.pk }}</a></li>
            {% endfor %}
        {% endif %}
    {% else %}
        {% for state in states %}
            <li><a href="?{% url_replace request 'location' state.pk %}">{{ state.name }} | {{ state.pk }}</a></li>
        {% endfor %}
    {% endif %}

但它很漫长而复杂。这就是为什么我想让这个更简单,更容易使用django-mptt。

0 个答案:

没有答案