Фильтр шаблонов Django не поднимает исключение при возникновении ошибки

Я создаю пользовательский фильтр шаблонов в Django для проверки, есть ли у пользователя права на просмотр определенных ссылок в моей навигации.

Я столкнулся с проблемой, когда хочу знать, является ли переданный аргумент плохим, то есть app_label, чтобы я мог бросить исключение на этом фронте и получить уведомление.

Вот мой HTML используемого фильтра, который работает без or, но с ним условный фильтр просто возвращает False без выброса исключения, что меня и смущает.

Примечание: У меня приложение называется 'reports', а не 'repordts', поэтому исключение определенно должно быть выброшено.

{% if request|has_perm_for_app_with_property:'repordts' or request|has_perm_for_app_with_property:'staff_reports' %}

Эта версия правильно выбрасывает исключение:

{% if request|has_perm_for_app_with_property:'repordts' %}

Вот код фильтра:

@register.filter()
def has_perm_for_app_with_property(request, app_label):
    """
    """
    user = request.user
    # ensure prop is set in session
    if not request.session.get('property'):
        return False

    print(app_label)

    # gather perms and show error if bad name
    perms_for_app = Permission.objects.filter(content_type__app_label=app_label)
    if not perms_for_app:
        raise Exception(f'No Perms for App: {app_label}')
    # check to ensure the permission passed is accurate
    allowed = any([user.has_perm(perm) for perm in perms_for_app])

    return allowed
{% if request|has_perm_for_app_with_property:'repordts' %}
{{ request|has_perm_for_app_with_property:'repordts' }}
{% else %}
{{ request|has_perm_for_app_with_property:'staff_reports' }}
{% endif %}

Этот код выбросит исключение, если передано 'repordts', но также проверит, есть ли у пользователя разрешение на 'staff_reports', если первая проверка вернет False.

В качестве альтернативы вы можете использовать блок "try-except", чтобы поймать исключение и обработать его более конкретным способом.

{% try %}
{{ request|has_perm_for_app_with_property:'repordts' }}
{% except Exception as e %}
{{ e }}
{% endtry %}

Таким образом вы можете поймать исключение и обработать его более конкретным способом, вместо того чтобы использовать простое условие if-else.

Вернуться на верх