30

特定のタスクを実行するビューがあり、hello.htmlテンプレートをレンダリングする別のビューに戻ります。

def 1stview(request):
   #Do this
   #Do that
   return HttpResponseRedirect('/success/')

def success(request):
    return render_to_response('overview.html', {'overview_files': b, 'total_files':total_files, 'total_size':total_size, 'username': username}, context_instance=RequestContext(request))

1番目のビューを正常に完了した後、「成功」メッセージをに渡しますoverview.html。表示するリダイレクトはたくさんありsuccessます。ファーストビューを通過するときだけメッセージを転送したい。どうやってやるの?

4

5 に答える 5

39

より精巧な答えを追加します。

1: settings.pyでメッセージストレージを構成します。

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

または、セッションを使用していない場合は、CookieStorageを使用します。

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.CookieStorage'

2:あなたの見解では、django.contrib.messagesをインポートします:

from django.contrib import messages

3:HttpResonseを返す前にメッセージデータを設定します。

messages.success(request, 'Changes successfully saved.')

これは次の省略形です。

messages.add_message(request, messages.SUCCESS, 'Changes successfully saved.')

次に、メッセージタグ(この場合はmessages.SUCCESS)をテンプレートで使用して、対応するCSSクラスを追加したり、デバッグメッセージを非表示にしたりできます。Djangoにはデフォルトでいくつか含まれていますが、これをBootstrapのデフォルトのアラートクラスで使用する場合は、欠落しているものにいくつかのカスタムメッセージタグを追加する必要があります。

4:Bootstrapアラートを使用している場合、テンプレートで次のようなメッセージを使用できます。

{% if messages %}
    {% for message in messages %}
        <div class="alert {% if message.tags %}alert-{{ message.tags }}{% endif %}" role="alert">{{ message }}</div>
    {% endfor %}
{% endif %}

たとえば、DjangoはERRORのデフォルトタグとして「error」を使用しますが、Bootstrapはエラーを示すために危険を使用します。最善の解決策はカスタムタグを使用することですが、テンプレートでモンキーパッチを適用することもできます(醜い解決策)。

{% if messages %}
    {% for message in messages %}
            <div class="alert {% if message.tags %}alert-{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}danger{% else %}{{ message.tags }}{% endif %}{% endif %}" role="alert">{{ message }}</div>
    {% endfor %}
{% endif %}
于 2018-03-22T09:42:37.377 に答える
22

メッセージフレームワークを使用して、ページリクエスト間でメッセージを送信します。

于 2013-02-21T10:13:57.630 に答える
8

i18n URLを使用するときは注意してください!のようなリンクを使用している/whatever/が国際化を使用している場合は、にリダイレクトされるため/en/whatever/、リクエスト内のメッセージが失われます。国際化を使用する場合は、常に言語をURLに渡します。

from django.contrib import messages
from django.utils.translation import get_language

messages.success(request, _('Thank you'))
return redirect('/%s/whatever/' % get_language())

これを理解するのに数時間かかります...

于 2017-09-25T19:57:33.617 に答える
4
from django.contrib import messages
messages.success(request, _('Thank you'))
return redirect('/whatever/')
于 2017-09-18T13:51:03.233 に答える
0

この問題を確認した後、問題が発生します。リダイレクトが1stview以外の関数からのものである場合、メッセージは常に表示されます。したがって、リダイレクトが1stviewからsend経由で行われたかどうかを確認する必要があります。GETは現在のステータスです。

from django.contrib import messages
def 1stview(request):
   
   return HttpResponseRedirect('/success/'+'?Status='+'True')

def success(request):
    Pass_1stview = request.GET.get('Status')
    if Pass_1stview :
       messages.success(request, _('Content of the messages'))
    return render_to_response('overview.html', {'overview_files': b, 'total_files':total_files, 'total_size':total_size, 'username': username}, context_instance=RequestContext(request))
于 2021-11-25T13:55:00.293 に答える