1

大規模な django プロジェクトで次の問題が発生しています。小さなモックアップ プロジェクト (以下のコード) で問題を再現できました。

POST されたフォームがis_valid()を返したときにメッセージを表示するために、包含タグ内でdjango メッセージング フレームワークを使用しようとしています。このアプローチは、別の回答でも使用されています(「最終更新」セクションを参照)。

問題は、POST 後にページがレンダリングされたときにメッセージがすぐに表示されないことです。代わりに、次に別の場所に移動したとき、またはPOST 応答を受信したにページを更新したときにメッセージが表示されます。

エラーは発生しません。遅延メッセージ表示を除いて、すべてが正常に動作しているように見えます。

このアプローチの理由は、複数のアプリで複数の小さなフォームを再利用しており、GET および POST ロジックに DRY プリンシパルを使用する必要があるためです。このアプローチは完全に機能します - 「成功」メッセージの表示が遅れる問題を除けば!

フィードバックや支援を本当にありがとう!

編集:メッセージを設定する行を明確にするために、「my_template.py」にあります:

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

デモプロジェクト:

settings.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']

index.html:

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

my_template.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 に答える