使用django.contrib.messages在视图中使用Django Success消息

时间:2017-03-19 23:26:55

标签: javascript python django

我正在开发一个系统,该系统允许用户为在其帐户中注册的玩家对象预订事件。以前我让系统成功重定向到主页但我决定尝试在预订成功时弹出工具提示样式。

我为此尝试了几件事,没有一件事对我有用。首先,我尝试添加" message =' Booking Successful。'"在我的渲染命令中,以及html模板中的脚本。这给了我" render()得到了一个意想不到的关键字参数' message'"。

然后我尝试在表单之后将它添加到上下文字典中,以便渲染请求显示为:

return render(request, 'tennis/make_booking.html', {'event_form': event_form, 'message': 'Booking Successful'})

这在技术上有效但邮件显示在页面加载上并不完全正确。

然后我终于尝试了对Django消息函数的调用,如下面的代码所示。当我加载页面时,此代码弹出一个空的消息框,当我单击book按钮时,它会给出一个错误,我将提供完整的堆栈跟踪。

编辑:忽略以上所有内容,下面的代码会在成功预订时向页面添加一行文字。这比我好,但如果可能的话,我希望它是一个弹出窗口。

views.py

@login_required
def make_booking(request):
    form = EventForm()

    if request.method == 'POST':
       event_form = EventForm(request.POST)
       print "HELLO"
       if event_form.is_valid():
          print "VALID"

          event = event_form.save(commit=False)
          player = request.user.player_set.all()[0]
          event.player = player
          event.save()
          # Consider rendering a different page
          messages.success(request, 'Your booking was successful!', extra_tags='alert')
       else:
            # invalid form, print problems to terminal
            print(event_form.errors)
    else:
         # not POST so render blank forms
         event_form = EventForm()
    return render(request, 'tennis/make_booking.html', {'event_form': event_form})

HTML模板:

{% extends 'tennis/base.html' %}

{% block body_block%}

    {% block title_block %}
        Make a Booking
    {% endblock %}

    <body>
        <h1> Book an Event </h1>
        If booking is sucessful you will be redirected to the home page
        <br>
        <div>
            <form id="event_form" method="post" action="/tennis/make_booking/">
               {% csrf_token %}
               {% for hidden in event_form.hidden_fields %}
                  {{ hidden }}
               {% endfor %}
               {% for field in event_form.visible_fields %}
                  {{field.errors}}
               {% endfor %}
               <p>{{ event_form.event.label_tag }} {{ event_form.event }}</p>
               <input type="submit" name="book" value="Book"/>
             </form>
        </div>
        {% if messages %}
            <ul class="messages">
                {% for message in messages %}
                    <li class="{{ message.tags }}">{{ message }}</li>
                {% endfor %}
            </ul>
        {% endif %}
    </body>

{% endblock %}

如何修改此代码,以便在单击我的图书按钮而不是仅添加一行文字时,弹出成功消息?

1 个答案:

答案 0 :(得分:1)

Django附带了一个内置的消息应用程序,您可以轻松地将其添加到项目中。

阅读Displaying messages to users in django上的这部分文档 还有这个blog post,用于在django中使用显示响应消息的快速教程。

您还会收到该特定错误,因为'book_message'不是消息模块的属性,因此将其从messages.book_message更改为messages.success