Фильтр шаблонов 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.