1

Ist es möglich, Präfix-Tags für Drittanbieter-Apps hinzuzufügen oder umzubenennen?Umbenennen/Hinzufügen von Präfix zu App-Vorlagen-Tags von Drittanbietern?

Erläuterung:

Wir django_tables2 in unserem Projekt verwenden. Aus Leistungsgründen entschieden wir uns, von django_tables2 zu django_datatable (https://github.com/shymonk/django-datatable) zu migrieren.

Wir wollen django_tables2 für ein paar Tabellen verwenden und Rest von ihnen zu django_datatable migrieren.

Das Problem ist, dass sowohl django_tables2 als auch django_datatable das gleiche Vorlagen-Tag {% render_table table %} verwenden. Und vielleicht wird es mehr Probleme geben, wenn wir tiefer gehen.

Antwort

2

Sie können den Tag mit einem anderen Namen neu registrieren:

from table.templatetags.table_tags import register, render_table 

register.tag('datatable_render_table', render_table) 

Sie diese irgendwo setzen sollte es während des Startvorgangs ausgeführt wird, zum Beispiel in AppConfig.ready().

+0

Dies ist eine sehr schöne Lösung. Nur um hinzuzufügen, ist es notwendig, datable Tags vor django_tables Tags zu laden, da render_table nicht nicht registriert ist. –

2

Ich glaube, der einfachste Weg wäre, den Code in mehrere Vorlagen (möglicherweise, einschließlich) zu teilen, so dass Sie nicht beide {% load django_tables %} und {% load table_tags %} (von Django-Datatable) in der gleichen Datei haben. Dies erfordert nichts Besonderes und würde mit jeder Django-Version funktionieren.

Wie zum Umbenennen, ich glaube nicht, dass es einen leicht verfügbaren Weg eingebaut ist. Es gibt eine Syntax nur bestimmte Tags/Filter ({% load render_table from table_tags %}) zu importieren, aber keine Möglichkeit, sie umzubenennen.

Eine Möglichkeit besteht darin, benutzerdefiniertes Ladeprogramm zu implementieren. Sie sollten wahrscheinlich einen Blick auf django.template.defaulttags.load Quellcode werfen, und kopieren Sie das, indem Sie Ihre eigene load_ex mit einer benutzerdefinierten {% load_ex render_table as render_table_dt from table_tags %} Syntax implementieren. Im Grunde genommen müssen Sie nur die erweiterte syntaktische Analyse hinzufügen und die Schlüssel lib.tags umbenennen (es ist nur ein dict, das von einem Tag-Namen zu einer Funktion mappt), entsprechend den bereitgestellten Regeln.

Oder - ein dreckiger Ansatz - Haken in django.template.defaulttags.find_library. Dort haben Sie sowohl die Bibliothek name und parser Beispiel so etwas wie folgt aus:

# Somewhere in your project's init code... 
if not hasattr(defaulttags.find_library, "_is_hacked"): 
    real_find_library = defaulttags.find_library 
    def find_library(parser, name): 
     lib = real_find_library(parser, name) 
     if name == "django_tables2" and "render_table" in lib.tags: 
      lib.tags["render_table2"] = lib.tags["render_table"] 
      del lib.tags["render_table"] 
     return lib 
    find_library._is_hacked = True 
    defaulttags.find_library = find_library 

Dies sollte ausreichen, um den Tag zu benennen. Ich habe den Code überhaupt nicht getestet (tut mir leid, wenn es irgendwelche Tippfehler oder einige Fehler gibt), aber Sie sollten die Idee bekommen.

Verwandte Themen