1

大型 django 项目中出现以下问题。我已经能够在一个小型模拟项目中复制该问题(代码如下)。

我正在尝试在包含标记中使用django 消息传递框架,以在 POST 表单返回is_valid()时显示消息。这种方法也已在此处的另一个答案中使用(请参阅“最终更新”部分)。

问题是在 POST 之后呈现页面时,消息不会立即显示。相反,当您下次在其他地方导航或在收到 POST 响应刷新页面时,该消息会出现。

我没有收到任何错误。一切似乎都在正常运行,除了延迟的消息显示。

采用这种方法的原因是因为我在多个应用程序中重复使用多个小型表单,并且我需要将 DRY 主体用于 GET 和 POST 逻辑。这种方法非常有效 - 除了延迟“成功”消息显示的问题!

非常感谢任何反馈或帮助!

编辑:要清楚设置消息的行在“my_template.py”中:

messages.add_message(context['request'], messages.SUCCESS, "Successfully added entry")

演示项目:

设置.py:

...
    TEMPLATE_CONTEXT_PROCESSORS = (
       "django.core.context_processors.request",
       "django.core.context_processors.media",
       "django.contrib.messages.context_processors.messages"
    )
...

base_layout.html:

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
</head>
<body>
{% for message in messages %}<div class="alert{% if message.tags %} alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>{% endfor %}
{% block content %}{% endblock %}
</body>
</html>

my_template.html:

<form action="" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>

表格.py:

from django.forms.models import ModelForm
from app.models import ContactMessage

class ContactForm(ModelForm):
    class Meta:
        model = ContactMessage
        fields = ['name']

索引.html:

{% extends "app/base_layout.html" %}
{% load my_template %}
{% block content %}
{% my_template %}
{% endblock %}

我的模板.py:

from django import template
from django.contrib import messages
from app.forms import ContactForm
register = template.Library()


@register.inclusion_tag('app/my_template.html', takes_context=True)
def my_template(context):

    if context['request'].method=='GET':
        return { 'form':ContactForm() }

    if context['request'].method=='POST':
        form = ContactForm(context['request'].POST)
        if not form.is_valid():
            return { 'form': form }

        form.save()

        messages.add_message(context['request'], messages.SUCCESS, "Successfully added entry")
        return { 'form':ContactForm() }
4

2 回答 2

0

消息传递框架通过中间件工作,您需要的是在同一请求/响应周期中通知发布的某种方式。你手头有上下文变量,所以为什么不给它添加一个值:

if form.is_valid():
    context['success']=True
else:
    context['success']=False

然后在您的模板中:

{%if success %}<div>whoohoo!</div>{%endif%}
于 2015-01-24T17:19:09.050 回答
0

根据 Django,消息会排队等待渲染,直到被渲染器清除。(参考)

在您的情况下,您{{ message }}在 base.html 中的标签呈现后添加消息。因此,您的消息将被存储,直到{{ message }}再次呈现 base.html 中的下一个视图。

为了解决这个问题,您可以将{{ message }}标签移到内容后面{% endblock %}。另一种可能的解决方案是使用 javascript{{ message }}从 my_template.html 或 base.html 末尾附加标签。

于 2017-02-20T03:16:17.930 回答