5

Allauth 的消息默认存储为模板目录中的文本文件,这些看起来像:

{% load i18n %}
{% blocktrans %}You cannot remove your primary e-mail address ({{email}}).{% endblocktrans %}

这些使用 django 的模板标签,但不是“HTML 友好”。我想对这些进行样式设置,并具有以下内容:

{% load i18n %}
<div class="alert alert-danger alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
            {% blocktrans %}You cannot remove your primary e-mail address ({{email}}).{% endblocktrans %}
 </div>

但是上面的代码只是将 HTML 呈现为文本。我不能将此 HTML 放入模板中,而只是在模板中执行 {{ message }},因为我想根据每个消息的偏差(至少是颜色!)更改其中的一些内容。

我怎么能做到这一点?谢谢!

4

1 回答 1

12

模板是消息样式标记的地方,而不是消息.txt文件。如果需要,您应该能够通过 Django 的默认值或条件语句来实现每个案例的变化。我看到您正在使用 Bootstrap,对于许多用例,默认的 Django 消息传递标签很好地映射到 Bootstrap 自己的警报类。在视图中创建消息时...

messages.success(request, 'You have logged in successfully.')

...每个 Django 消息都包含其级别(等)的字符串表示形式'info''success'作为标签属性。您可以将这些标签属性用于许多上下文格式设置需求。因此,您可以将其传递给(例如基本)模板,例如:

<div class="alert alert-{{ messages.tags }} alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
        <span aria-hidden="true">&times;</span>
    </button>
    {{ message }}
</div>

如果您的消息具有级别success,则此处呈现的 CSS 类将为alert-success,因此 Bootstrap 将显示绿色警报。如果状态为info,则为alert-info蓝色等。

Django 的默认消息级别和字符串表示定义在django/contrib/messages/constants.py

DEFAULT_TAGS = {
    DEBUG: 'debug',
    INFO: 'info',
    SUCCESS: 'success',
    WARNING: 'warning',
    ERROR: 'error',
}

DEFAULT_LEVELS = {
    'DEBUG': DEBUG,
    'INFO': INFO,
    'SUCCESS': SUCCESS,
    'WARNING': WARNING,
    'ERROR': ERROR,
}

将此与 Bootstrap 的默认警报类和上下文格式进行比较:

引导默认警报类和上下文颜色

info,successwarning类镜像 Django 的消息级别,因此这些消息将自动获得 Bootstrap 的正确格式。但是 Django 最严重的级别是error,而 Bootstrap 是danger.

对于这种名称冲突,建议的解决方法是:保持 Django 模板标签不变,这将为元素提供一个名为alert-error. 然后在您的 HTML 模板中的某处使用几行 Javascriptalert-danger作为额外类添加到这些元素:

// Javascript somewhere in your HTML template
let errorElements = document.getElementsByClassName('alert-error');
[...errorElements].forEach(el => {el.classList.add('alert-danger')});

这会将“alert-danger”类添加到具有“alert-error”类的元素中。Bootstrap 将忽略“alert-error”,但是将“alert-danger”添加到元素的类列表中,它们将获得 Bootstrap 的红色上下文格式。

如果您想使用 allauth 专门定制一些东西,例如设置与 allauth 的默认值不同的消息级别 - 例如,登录消息作为info级别而不是success- 您可以直接在allauth.account.views(and allauth.socialaccount.views) 中更改它们。

您还可以将额外的标签传递给 Django 消息并将它们用于条件格式:例如,请参阅文档中的额外消息标签和此答案

(编辑:删除了关于更改 Django 核心代码的原始想法 - 不好。)

于 2017-05-30T01:49:04.097 回答