Как я могу добавить дополнительные данные в сообщения Django?

Я пытаюсь интегрировать этот фрагмент в наш проект Django:

Это просто обычай HTML а также CSS для сообщений.

html выглядит так:

<div class="bs-calltoaction bs-calltoaction-success">
    <div class="row">
        <div class="col-md-9 cta-contents">
            <h1 class="cta-title">Its a Call To Action</h1>
            <div class="cta-desc">
                <p>Describe the action here.</p>
                <p>Describe the action here.</p>
                <p>Describe the action here.</p>
            </div>
        </div>
        <div class="col-md-3 cta-button">
            <a href="#" class="btn btn-lg btn-block btn-default">Go for It!</a>
        </div>
     </div>
</div>

Так что, если я хочу интегрировать его с платформой сообщений, я могу сделать:

{% for message in messages %}
    <div class="bs-calltoaction bs-calltoaction-{{ message.tags }}">
        <div class="row">
            <div class="col-md-9 cta-contents">
                {{ message }}
            </div>
            <div class="col-md-3 cta-button">
                <a href="#" class="btn btn-lg btn-block btn-default">Go for It!</a>
            </div>
         </div>
    </div>
{% endfor %}

Но я хотел бы указать заголовок <h1> и список вложенных сообщений <p> поэтому мне нужно добавить в сообщение что-то вроде словаря, который может содержать дополнительные атрибуты, такие как {'title':'This is a title','submessages':[1,2,3]} так что я могу сделать:

{% for message in messages %}
    <div class="bs-calltoaction bs-calltoaction-{{ message.tags }}">
        <div class="row">
            <div class="col-md-9 cta-contents">
                <h1 class="cta-title">{{ message.title }}</h1>
                <div class="cta-desc">
                    <p>{{ message.submessages.0 }}</p>
                    <p>{{ message.submessages.1 }}</p>
                </div>
            </div>
            <div class="col-md-3 cta-button">
                <a href="#" class="btn btn-lg btn-block btn-default">Go for It!</a>
            </div>
         </div>
    </div>
{% endfor %}

Возможно ли использовать сообщения Django? Или вы бы предложили другой подход? Я могу передать такие переменные в контекст, но я хотел бы использовать сообщения, если это возможно.

1 ответ

Решение

Вы можете получить определенное количество свободы, используя extra_tags атрибут сообщений.

См. https://docs.djangoproject.com/en/1.11/ref/contrib/messages/.

Таким образом, вы могли бы иметь разные extra_tags для разных призывов к действию, например

# views.py
messages.success(request, 'You have signed up', extra_tags='suggest_upgrade')

или же:

messages.success(request, 'You have signed up', extra_tags='suggest_share')

а потом:

{% for message in messages %}

    {% if 'suggest_upgrade' in message.extra_tags %}
        <h1>Get these extra features</h1>
        <p>info here</p>
    {% elif 'suggest_share' in message.extra_tags %}
        <h1>Share with friends</h1>
        <p>other info here</p>
    {% endif %}

{% endfor %}

Вы можете даже передать подмассаж в качестве самого тега, хотя он, вероятно, не предназначен для этой цели:

messages.success(request, 'Main message here', extra_tags='submessage here')

а потом:

{% for message in messages %}

    <h1>{{ message }}</h1>
    <p>{{ message.extra_tags }}</p>

{% endfor %}

Сообщение не обязательно должно быть строкой. В вашем случае, использование словаря будет работать нормально:

messages.success(request, {'title':'This is a title','submessages':[1,2,3]})

а затем в вашем шаблоне:

{% for message in messages %}
    <div class="bs-calltoaction bs-calltoaction-{{ message.tags }}">
        <div class="row">
            <div class="col-md-9 cta-contents">
                <h1 class="cta-title">{{ message.message.title }}</h1>
                <div class="cta-desc">
                    <p>{{ message.message.submessages.0 }}</p>
                    <p>{{ message.message.submessages.1 }}</p>
                </div>
            </div>
            <div class="col-md-3 cta-button">
                <a href="#" class="btn btn-lg btn-block btn-default">Go for It!</a>
            </div>
         </div>
    </div>
{% endfor %}
Другие вопросы по тегам