1

django でメッセージ フレームワークを機能させようとしています。

これが私のsettings.pyの興味深い部分です

INSTALLED_APPS = (
    'django.contrib.sessions',
    'django.contrib.messages',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

には何も追加していないTEMPLATE_CONTEXT_PROCESSORSので、デフォルト値です。

メッセージを表示したい私のビュー:

from django.contrib.messages import get_messages

class ProfileFrontpage(TemplateView):

    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated():

            #Get messages
            messages = get_messages(request)

            #Get the user            
            user = self.request.user

            #Used benefit
            used_benefit_list = Benefit.published.filter(used_benefit__user = user)

            return render(request, "accounts/frontpage.html", {"messages": messages, "used_benefit_list": used_benefit_list})
        else:
            return render(request, 'accounts/not_authenticated.html')

テンプレート:

{% if messages %}
        {% for message in messages %}
            <div class="alert {{ message.tags }}">
                <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                {{ message }}
            </div>
        {% endfor %}  
{% endif %}

そして、フォームが有効な場合にメッセージを作成する必要がある私のフォームは次のとおりです。

def show_profileform(request):       
    if request.user.is_authenticated():
        user = request.user

        ProfileFormInlineFormSet = inlineformset_factory(User, Profile, form=ProfileForm, can_delete=False)

        if request.method == "POST":
            form = UserForm(request.POST, request.FILES, instance=request.user, prefix="main")
            formset = ProfileFormInlineFormSet(request.POST, request.FILES, instance=request.user, prefix="nested")        
            if 'submit' in request.POST:
                if form.is_valid() and formset.is_valid():

                    u = User.objects.get(username = request.user)                    

                    #Save to database
                    user = form.save()
                    profile = formset.save()

                    messages.success(request, "Settings updated", extra_tags='alert-success')

                    return HttpResponseRedirect('/accounts/')

        else:
            form = UserForm(instance=request.user, prefix="main")
            formset = ProfileFormInlineFormSet(instance=request.user, prefix="nested")

        return render(request, "accounts/form.html", {"form":form, "formset":formset})
    else:
        return render(request, 'accounts/not_authenticated.html')

メッセージが表示されない理由を知っている人はいますか?

4

1 に答える 1

1

デフォルトTEMPLATE_CONTEXT_PROCESSORS設定には、メッセージ コンテキスト プロセッサが含まれます。したがって、あなたの見解で行う必要はありません。実際、あなたの場合は有害です。 への呼び出しはメッセージを取得し、メッセージ ストアをクリアします。次に、コンテキスト プロセッサは同じことを試みますが、ビューがそれらをクリアしたため、何も見つかりません。次に、テンプレート コンテキストにキーを設定し、ビューから値を上書きします。get_messages(request)get_messages()messages

要するに、ProfileFrontpageビューからメッセージ処理を削除すると、うまくいくはずです。

于 2014-01-10T12:42:44.240 に答える