我该如何向Django消息中添加额外的数据?

5

我正在尝试将这个片段集成到我们的Django项目中:

它只是用于消息的自定义HTMLCSS

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':'这是一个标题','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消息模块是否可行?或者您建议另一种方法?我可以将这些变量传递到上下文中,但如果可能的话,我想使用消息模块。


太糟糕了,extra_tags 属性是一个字符串而不是字典。这样传递结构化数据几乎是不可能的。我不理解这个选择。 - David Dahan
2个回答

8
你可以通过使用 extra_tags 消息属性来获得一定程度的自由。
请参见 https://docs.djangoproject.com/en/1.11/ref/contrib/messages/#adding-extra-message-tags 因此,您可以为不同的操作调用设置不同的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 %}

3

消息并不一定需要是一个字符串。在您的情况下,使用字典就可以很好地解决:

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 %}

已在Django 2.2.1中进行了测试,它将消息转换为字符串,因此不再起作用。 - jaanus
@jaanus 确实,这也不是最好的方法。 - xpy
1
在 Django 4 中有什么解决方案? - anjanesh
@anjanesh 我不确定是否有一个优雅的解决方案。你可以尝试使用JSON stringify或序列化,但仍然不够优雅。或者,你可以创建一个消息的包装器,然后使用https://docs.djangoproject.com/en/4.1/topics/templates/#django.template.loader.render_to_string来创建你将传递给消息的字符串。 - xpy
我最终使用JavaScript和AplineJS完成了这个项目 - https://anjane.sh/3AFzzbn - anjanesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接