在Django中如何将消息显示为弹出窗口/提示框?

3

我有一个表单,提交后会重定向到自身。我想显示一条消息,上面写着“您已输入(work_area)”。目前,我只能在提交后在HTML中显示一些信息,但没有变量。 我想让它成为一个弹出窗口或警告消息,用户在看完后可以关闭,但我不知道在Django中如何实现。

views.py

class EnterExitArea(CreateView):
    model = EmployeeWorkAreaLog
    template_name = "operations/enter_exit_area.html"
    form_class = WarehouseForm
    #success_message = "You have logged into %(work_area)s"

    def form_valid(self, form):
        emp_num = form.cleaned_data['employee_number']
        area = form.cleaned_data['work_area']
        station = form.cleaned_data['station_number']

        if 'enter_area' in self.request.POST:
            form.save()
            EmployeeWorkAreaLog.objects.filter((Q(employee_number=emp_num) & Q(work_area=area) & Q(station_number=station)).update(time_in=datetime.now())

            messages.info(self.request, "You have entered")
            return HttpResponseRedirect(self.request.path_info)

enter_exit_area.html

{% extends "base.html" %}

{% block main %}
    <form id="warehouseForm" action="" method="POST" class="form-horizontal" novalidate >
        {% csrf_token %}

        {% if messages %}
            <ul class="messages">
            {% for message in messages %}
                <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
            {% endfor %}
            </ul>
        {% endif %}

        <div>
            <div>
                <label>Employee</label>
                {{ form.employee_number }}
            </div>

            <div>
                <label>Work Area</label>
                {{ form.work_area }}
            </div>
            <div>
                <label>Station</label>
                {{ form.station_number }}
            </div>
        </div>

        <div>
            <div>
                <button type="submit" name="enter_area" value="Enter">Enter Area</button>

            </div>
        </div>
    </form>

{% endblock main %}

以下是它的显示效果:

编辑:

enter image description here


1
你可能想要研究一下jQuery对话框或Bootstrap模态框,或者只是一个普通的JavaScript警告框。 - Matt Cremeens
2个回答

15

这更像是一个有关于 Javascript 的问题,但不管怎样,以下是我如何处理它(如果您正在使用 Bootstrap):

1)创建一个名为message.html的文件,并具有以下内容:

{% for message in messages %}
  <div class="toast notification bg-{% if message.tags == 'error' %}danger{% else %}{{message.tags}}{% endif %}" role="alert" aria-live="assertive" aria-atomic="true" data-delay="5000">
    <div class="toast-header">
      <strong class="mr-auto">
        {% if message.tags == 'error' %}
          <i class="fas fa-times mr-2"></i>
        {% elif message.tags == 'warning' %}
          <i class="fas fa-exclamation mr-2"></i>
        {% elif message.tags == 'info' %}
          <i class="fas fa-info mr-2"></i>
        {% elif message.tags == 'success' %}
          <i class="fas fa-check mr-2"></i>
        {% endif %}
        {{message.tags|capfirst}}
      </strong>
      <button type="button" class="ml-2 mb-1 close" data-dismiss="toast" aria-label="Close">
        <span aria-hidden="true">&times;</span>
      </button>
    </div>
    <div class="toast-body">
      {{message|safe}}
    </div>
  </div>
{% endfor %}

2) 更改你的base.html文件,添加如下内容:

...
{% include 'message.html' %}
...


<!-- and at the end:-->
<script src="{% static 'js/jquery-3.4.1.min.js' %}"></script>
<script src="{% static 'js/bootstrap.min.js' %}"></script>
{% if messages %}
  <script>
      {% for message in messages %}
          $(document).ready(function () {
              $('.toast').toast('show');
          });
      {% endfor %}
  </script>
{% endif %}

另外,不要忘记包含 Bootstrap。

这样你就可以在 所有 的模板中使用 Django 消息,而无需显式更改它们。

编辑

你还需要这个自定义 CSS 类才能让你的通知显示在页面右上角:

.notification{
    position: absolute;
    top: 5rem;
    right: 1rem;
}

这个方法非常有效,我想我可能做了一些奇怪的事情。两个问题,我应该把脚本添加到base.html中的<body>标签内吗?还有,当我使用$('.toast').toast('show');时,我收到一个警告,说“未解决的函数或方法toast()”。我会添加一张当前页面显示方式的图片。 - Mariana Gomez-Kusnecov
  1. 是的,请将脚本放在body标签内 - 在末尾。
  2. 我认为您缺少了Bootstrap的javascript文件(bootstrap.min.js)。
- Pedram
我按照这个顺序编写脚本,对我来说它能正常工作:1) jQuery 2) bootstrap 3) 自定义脚本。也许你是在将自定义脚本放在了 bootstrap 或 jQuery 之前? - Pedram
请检查编辑后的内容,看它是否解决了问题(抱歉,我忘记了那个自定义CSS类)。 - Pedram
你不需要使用 {% for message in messages %},因为你只需要调用一次 $('.toast').toast('show'); (实际上它并没有使用 message 变量)。 - am70
显示剩余2条评论

0
Django内置了用于消息处理的函数。
messages.success(self.request,"message sent")

在你的HTML中,一定要创建一个消息类。
{% if message.tags %} class="{{message.tags}}"{% endif %}

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