28

私は自分の django アプリケーションの 1 つのテストを書いていて、かなり長い間この問題を回避しようとしていました。django.contrib.messagesさまざまなケースを使用してメッセージを送信するビューがあります。ビューは次のようになります。

from django.contrib import messages
from django.shortcuts import redirect

import custom_messages

def some_view(request):
    """ This is a sample view for testing purposes.
    """

    some_condition = models.SomeModel.objects.get_or_none(
        condition=some_condition)
    if some_condition:
        messages.success(request, custom_message.SUCCESS)
    else:
        messages.error(request, custom_message.ERROR)
    redirect(some_other_view)

現在、このビューの応答をテストしている間、このビューはリダイレクトを使用するため、を含む辞書が含まclient.getれていません。テンプレートをレンダリングするビューの場合、 を使用してメッセージ リストにアクセスできます。リダイレクトするビューへのアクセスを取得するにはどうすればよいですか?contextmessagesmessages = response.context.get('messages')messages

4

5 に答える 5

1

ビューがリダイレクトされfollow=trueていて、テスト クライアントへのリクエストで を使用している場合、上記は機能しません。最終的に、応答とともに送信された最初の (そして私の場合は唯一の) メッセージを取得するためのヘルパー関数を作成しました。

@classmethod
def getmessage(cls, response):
    """Helper method to return message from response """
    for c in response.context:
        message = [m for m in c.get('messages')][0]
        if message:
            return message

これをテスト クラスに含めて、次のように使用します。

message = self.getmessage(response)

またはからresponse返されるものはどこにありますか。getpostClient

これは少し壊れやすいですが、他の誰かの時間を節約できることを願っています.

于 2013-09-12T00:59:32.337 に答える
1

サードパーティのアプリを使用しているときに同じ問題が発生しました。

別のビュー内から HttpResponseRedict (コンテキストにアクセスできない) を返すビューからメッセージを取得する場合は、次を使用できます。get_messages(request)

from django.contrib.messages import get_messages  

storage = get_messages(request)  
for message in storage:  
    do_something_with_the_message(message)  

ただし、これによりメッセージ ストレージがクリアされるため、後でテンプレートからメッセージにアクセスする場合は、次を追加します。

storage.used = False
于 2014-06-24T07:41:58.900 に答える