Wdrażam aplikację niestandardowych uprawnień w moim projekcie Django i nie mam pojęcia, jak zaimplementować niestandardowy znacznik szablonu, który sprawdza uprawnienia zalogowanego użytkownika dla określonej instancji obiektu i pokazuje fragment HTML na podstawie wyniku sprawdzenia.if..else niestandardowy znacznik szablonu
Co mam teraz jest (pseudokod):
{% check_permission request.user "can_edit" on article %}
<form>...</form>
{% endcheck %}
('check_permission' to mój zwyczaj szablon).
Templatetag pobiera użytkownika, uprawnienie i instancję obiektu i zwraca załączony kod HTML (formularz). To obecnie działa dobrze.
Co chciałbym jednak zrobić, jest coś takiego jak:
{% if check_permission request.user "can_edit" on article %}
<form>...</form>
{% else %}
{{ article }}
{% endif %}
Czytałem o the assignment tag, ale mój strach jest, że ja zanieczyszczają kontekstowe przestrzeni zmiennych z tego (czyli mogę nadpisać poprzednie zmienne kontekstu uprawnień). Innymi słowy, ponieważ zmienne kontekstowe są definiowane na różnych poziomach (widok, oprogramowanie warstwy pośredniej w moim przypadku, a teraz ten znacznik szablonu przypisania), martwię się o łatwość konserwacji.
Dzięki, filtry rzeczywiście mogą być opcją. Przewiduję jednak różne uprawnienia (nie tylko podstawowy CRUD na instancję, ale niektóre bardzo konkretne), co oznacza, że musiałbym utworzyć równą ilość niestandardowych filtrów szablonów. Być może powinienem jednak ponownie przemyśleć mój model uprawnień niestandardowych. Jeśli powiesz, że przekazanie wielu argumentów do filtra jest trudne, masz na myśli, że jest to możliwe? Myślałem, że tak nie jest, więc czy mógłbyś to trochę wyjaśnić? – LaundroMat
Aktualizacja dla przyszłych użytkowników: Myślę, że spróbuję rozwiązać to za pomocą przykutych filtrów (np. '{{Request.user | has_permission:" entries.entry.can_edit, "| has_permission_on: article}}'. Niestandardowy filtr szablonu has_permission zwraca użytkownika i wymagane uprawnienie, has_permission_on następnie pobiera te wartości, sprawdza je względem zmiennej artykułu i zwraca True lub False. – LaundroMat