3

ここにあなたのための難問があります、

Django 1.4を使用すると、メッセージミドルウェアを介して設定されたメッセージをテンプレートに表示できません。Djangoのドキュメントを調べて、settings.pyファイルが関連するアプリ、コンテキストプロセッサ、ミドルウェアを参照していることを確認しました。ビューがRequestContextインスタンスでレンダリングされていることを確認しました。 それでも、テンプレートに表示されるメッセージを取得できません。

settings.py:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
...
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.request',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.contrib.messages.context_processors.messages',
'tekextensions.context_processors.admin_media_prefix',
)
...
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin', #Admin interface
'django.contrib.admindocs', #Admin docs
...

私のメッセージerror_levelは20に設定されています(つまり、「info」以上)。デフォルトのマッピングを使用しています。

views.py:

from django.contrib import messages

def index(request, *args, **kwargs):
    #Do some funky jazz which works like build the timeline & page vars
    ...
    messages.error = (request,"Horsey Bollox!")
    messages.add_message = (request, messages.ERROR,"Why won't this f***ing thing work?") #Attempting alternate method
    return render_to_response('funkyjazzdirectory/index.html',
                        {
                            'page': page, 
                            'timeline': timeline,
                        },
                        context_instance=RequestContext(request))

テンプレート:(funkyjazzdirectory / index.html)

{% extends "base.html" %}
{% if messages.error %}
    <div class="messages-errors">
        Error:
        <ul>
            {% for msg in messages %}
                <li>{{msg}}</li>
            {% endfor %}
        </ul>
    </div>
{% endif %}
<p>
    Other stuff such as iterating through {{timeline}} which renders absolutely fine
</p>

{{msg}}を次のように置き換えてみました。

<li>{{msg.message}}</li>

成功しませんでした。

ページの残りの部分は正常に出力され、Djangoはエラーをスローしません。コンソールには異常なものは何も含まれていません。生成されたHTMLコードには、divもlistタグも含まれていません。これが拡張するテンプレート(base.html)は、{{messages}}変数を使用せず、それを使用するテンプレートタグを呼び出しません。

index.htmlテンプレートの上部でテストするために、{{messages}}をカスタムテンプレートタグに渡してみました。ここで私ができること:

def __init__(self, messages):
    self.messages = messages
    def render(self, context):
    l = dir(context[self.messages])
        print(l)

...おそらくメッセージオブジェクトのメソッド/プロパティのリストを生成します。それでも、「メッセージ内のm:」は一度も実行されないため、これを繰り返すことはできません。次の方法でこのエンティティのサイズを検出しようとしています。

print(len(context[self.messages]))

コンソールには何も表示されません。

実際に何かを出力できるのは、render_to_responseタグ内のテンプレートにmessagesオブジェクトを手動で渡してから、messages.error({%for msg in messages.error%})を繰り返して2つの箇条書きを生成したときだけでした。正しいdivで:最初はvarダンプのように見えるもので埋められます: "、POST:、COOKIES:{'csrftoken':" ...最後のエラーメッセージだけを含む2番目の箇条書き: "なぜこれをしないのですか? f *** ing事は動作しますか?」(明らかに、これは単なるテストであり、コンテキストを介してテンプレートに到着する必要があることがわかっているため、render_to_responseを介して渡されたdictにメッセージを保持していません)

それで、私はどこで間違ったのですか?

テンプレートにエラーメッセージが表示されないのはなぜですか?メッセージをコンソールに表示することさえできないのはなぜですか?

私より賢い人が落とすことができるどんな光でも非常に役に立ちます!

4

1 に答える 1

5

あなたはメッセージを追加するために非常に奇妙な方法を使用しているようです:

messages.error = (request,"Horsey Bollox!")
messages.add_message = (request, messages.ERROR,"Why won't this f***ing thing work?") 

正しい構文は次のとおりです。

messages.error(request,"Horsey Bollox!")
messages.add_message(request, messages.ERROR,"Why won't this f***ing thing work?") 

ただし、設定とテンプレートは問題ありません。

于 2012-07-30T19:44:06.917 に答える