2017-05-29 106 views
2

Allauth的消息被默认保存为文本文件模板目录中,并且这些看起来像:Django的allauth自定义消息:与HTML/CSS样式消息

{% 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}},因为我想根据每条消息偏差(至少是颜色!)更改其中的一部分。

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

回答

1

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

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

...每个Django的消息中包含的水平('info''success'等)为tags attribute的字符串表示。您可以将这些标记属性用于许多上下文格式需求。所以,你可以将它传递给(例如碱)的模板,如:

<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,所以引导会显示绿色警报。如果状态为info,则它将是alert-info和蓝色等。

Django默认的信息水平字符串表示在django/contrib/messages/constants.py定义:

Bootstrap default alert classes and contextual colours

infosuccesswarning类反映Django的消息:

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

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

与引导的default alert classes和上下文格式化比较一下级别,但Django最严重的级别是error而Bootstrap的是danger。为了使Django的error级消息在Bootstrap的alert-danger类中轻松显示,请将DEFAULT_TAGS条目从ERROR: 'error'更改为ERROR: 'danger'。或者保持Django核心代码不变,如'ERROR': MESSAGES_ERROR_STRING,并在设置文件中定义该常量。 (你甚至可以创建自定义的Bootstrap类并定义你自己的Django消息级别以符合这些。)

如果你想与allauth专门定制的东西,例如从allauth的默认设置不同的消息级别 - 比如说,登录消息info水平,而不是success - 您可以直接在allauth.account.views(和allauth.socialaccount.views改变它们)

您也可以将额外的标签传递给Django消息并将其用于条件格式化:例如,请参阅extra message tags文档和this answer

+1

您说:“或者保持Django核心代码完好无损,如'错误':MESSAGES_ERROR_STRING并在您的设置文件中定义该常量”但这需要更改django核心代码,不是吗?除此之外,谢谢你的详细解答! –

+0

是的,尽管这意味着您仍然可以使用默认值运行在同一个Django安装中的任何其他项目,方法是在每个项目的设置文件中定义它。此外,它使得变更更加明确可维护性而不是掩埋它。这是一种方式。 – birophilo