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.')

'info'...各 Django メッセージには、そのレベル ('success'など)の文字列表現がtags 属性として含まれています。これらのタグ プロパティは、文脈に応じた書式設定の多くのニーズに使用できます。したがって、次のように(ベースなどの)テンプレートに渡すことができます。

<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 は緑色のアラートを表示します。ステータスが の場合、と青のようになりますinfoalert-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 のデフォルトのアラート クラスとコンテキスト フォーマットと比較してください。

ブートストラップのデフォルト アラート クラスとコンテキスト カラー

infosuccessおよびwarningクラスは Django のメッセージ レベルをミラーリングするため、これらのメッセージは Bootstrap の正しいフォーマットを自動的に取得します。しかし、Django の最も深刻なレベルはerrorBootstrap のdanger.

この名前の競合に対する推奨される回避策は、Django テンプレート タグを変更せずに保持することです。これにより、要素に というクラスが与えられalert-errorます。次に、HTML テンプレートのどこかに数行の Javascript を使用して、alert-dangerこれらの要素に追加のクラスとして追加します。

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

これにより、クラス「alert-error」を持つ要素にクラス「alert-danger」が追加されます。'alert-error' は Bootstrap によって無視されますが、要素のクラス リストに 'alert-danger' が追加されると、Bootstrap の赤いコンテキスト フォーマットが適用されます。

allauth で特にカスタマイズしたい場合、たとえば、allauth のデフォルトとは異なるメッセージ レベルを設定する場合 (ログイン メッセージをinfoレベルではなくレベルとして設定するなど) は、 (および)successで直接変更できます。allauth.account.viewsallauth.socialaccount.views

また、追加のタグを Django メッセージに渡し、これらを条件付き書式設定に使用することもできます。たとえば、ドキュメントの追加のメッセージ タグとこの回答を参照してください。

(編集:Djangoコアコードの変更に関する元のアイデアを削除しました-悪い。)

于 2017-05-30T01:49:04.097 に答える