中文标题: 连接 Bootstrap5 Alert 样式和 Django Message Tags

在开发过程中,AI 生成了如下的代码:

{% if messages %}
    <div class="alert alert-{{ message.tags }}" role="alert">
        {{ message }}
    </div>
{% endif %}
from django.contrib import messages
...
messages.add_message(request, messages.ERROR, 'Info message')

但是,AI 生成的代码无法工作,因为 Bootstrap5 Alert 样式和 Django Message Tags 之间没有直接的映射关系。 在这里,我们想要的是红色的错误消息,但因为上述原因,我们实际看到的只有文字,没有 alert 样式。

为了实现这个目标,我们需要新增一个 filter, 在模板中使用。

如下是新增的 filter 文件 your_django_app/templatetags/template_filters.py

# api2d/templatetags/template_filters.py
from django import template
from django.contrib.messages import constants

register = template.Library()

@register.filter
def bootstrap_alert_class(message_tag):
    """
    Maps Django's message tags to Bootstrap's alert classes.
    Django passes message tags as strings (e.g., 'error', 'success'),
    so we map these directly to Bootstrap's alert classes.
    """
    MAPPING = {
        'error': 'danger',
        'success': 'success',
        'info': 'info',
        'warning': 'warning',
        'debug': 'secondary',
    }
    # Convert to lowercase to handle case variations
    return MAPPING.get(message_tag.lower(), message_tag)

然后在模板中使用这个 filter:

{% load template_filters %}  <!-- Add this line -->


{% if messages %}
    {% for message in messages %}
        <div class="alert alert-{{ message.tags|bootstrap_alert_class }}" role="alert"> <!-- Use the filter -->
            {{ message }}
        </div>
    {% endfor %}
{% endif %}