J'utilise le templatetag de MPTT pour rendre mon arbre de genre.Django MPTT - Filtrage d'arbres
{% for genre, structure in genres|tree_info %}
{% if tree.new_level %}<ul><li>{% else %}</li><li>{% endif %}
{{ genre.name }}
{% for level in tree.closed_levels %}</li></ul>{% endfor %}
{% endfor %}
La chose est, mon objet genre
a is_visible
propriété qui doit être respecté.
def is_visible(self):
if self.is_root_node() or not self.visibility:
return self.visibility
for parent in self.get_ancestors():
if not parent.visibility:
return False
return True
Quelle est la manière la plus intelligente et la plus propre d'accomplir ceci?
informations supplémentaires
J'ai besoin (X) imbrication de liste HTML à produire correctement. J'ai défini des fonctions SQL pour la vérification de la visibilité héritée.
CREATE OR REPLACE function get_genre_parent_id(_genre_id int)
RETURNS INTEGER AS $$
DECLARE
_parent_id INTEGER;
_genre_id ALIAS FOR $1;
BEGIN
SELECT parent_id INTO _parent_id
FROM product_productgenre
WHERE id = _genre_id;
RETURN _parent_id;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE function is_genre_visible(_genre_id int)
RETURNS BOOLEAN AS $$
DECLARE
_visible BOOLEAN;
_genre_id ALIAS FOR $1;
BEGIN
SELECT visibility INTO _visible
FROM product_productgenre
WHERE id = _genre_id;
RETURN _visible;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE function is_genre_branch_visible(_genre_id int)
RETURNS BOOLEAN AS $$
DECLARE
visible BOOLEAN;
_genre_id ALIAS FOR $1;
_temp_genre_id INTEGER;
BEGIN
visible = true;
_temp_genre_id := _genre_id;
-- checking for our own genre
IF NOT is_genre_visible(_temp_genre_id) THEN
RETURN false;
END IF;
-- iterating through all parent genres
WHILE get_genre_parent_id(_temp_genre_id) IS NOT NULL LOOP
_temp_genre_id = get_genre_parent_id(_temp_genre_id);
IF NOT is_genre_visible(_temp_genre_id) THEN
RETURN false;
END IF;
END LOOP;
RETURN visible;
END;
$$ LANGUAGE plpgsql;
et a essayé de remplacer la balise full_tree_for_model
pour le faire utiliser un gestionnaire personnalisé, qui ajoute simplement is_genre_branch_visible(genre_id)
supplémentaire à la QuerySet. Mais quelque chose ne va pas avec la commande, ne peut pas vraiment comprendre cela.
Plus Cela fonctionne, mais je n'aime pas l'approche, me semble moche.
Il ne sera pas, car il génère des balises invalides de nidification ('tree.closed_levels'). – ohnoes