1

私はいくつかの ajax ページを含むサイトを持っています。ユーザーがブラウザ/login/で入力すると、基本テンプレートから拡張された、完全にレンダリングされたテンプレートを取得する必要があります。しかし、ユーザーがログイン ボタンをクリックする$('#content').ajax('/login/');と呼び出されるので、完全なテンプレートをレンダリングする必要はありません。

つまり、私はこれを持っています ( login_ajax.html):

{% load i18n %}

{% block title %}
    {% trans "Login" %}
{% endblock %}

{% block content %}
    {% include "social.html" %}
{% endblock %}

login.html

{% extends "base.html" %}

{% block ajax_content %}
{% include "login_ajax.html" %}
{% endblock %}

シンプルなログイン ビュー:

def login(request):
    c = Context({'user': request.user})

    if request.is_ajax():
        return render_to_response('login_ajax.html', c, context_instance=RequestContext(request))

    return render_to_response('login.html', c, context_instance=RequestContext(request))

この問題は、include タグのドキュメントに関連しています。

include タグは、「このサブテンプレートを解析し、親の一部であるかのようにそのコンテンツを含める」のではなく、「このサブテンプレートをレンダリングして HTML を含める」の実装と見なす必要があります。これは、インクルードされたテンプレート間で状態が共有されないことを意味します。各インクルードは完全に独立したレンダリング プロセスです。

titleしかし、ビューに名前を配置したり、login.htmlandに 2 回配置したりしたくありませんlogin_ajax.html

4

2 に答える 2

0

{% block title %}に戻ってlogin.html、2回のajax呼び出しを行う必要があると思います。1つはオーバーライド{% block ajax_content %}し、もう1つはオーバーライドします{% block title %}。オーバーライドに使用したのと同じパターンをオーバーライド{% block title %}に使用できます{% block ajax_content %}が、実際に新しいtitle.htmlテンプレートを作成せずに管理できる可能性があります。

私はあなたの問題を回避する他の方法を見ることができません。

于 2013-02-22T12:30:39.540 に答える
0

わかりました、簡単な解決策を見つけました。実際、問題は「ベースから拡張するか、拡張しないか」です。

login.html実際、拡張する必要のあるテンプレートは気にしません。したがって、ajax リクエストの場合、親テンプレートは になりempty.html、デフォルト リクエストの場合、親テンプレートは になりますbase.html。したがって、ビューで親テンプレートを指定します。

def login(request):
    c = Context({'user': request.user, 'extends': 'empty.html'})

    if request.is_ajax():
        return render_to_response('login.html', c, context_instance=RequestContext(request))

    c['extends'] = 'base.html'
    return render_to_response('login.html', c, context_instance=RequestContext(request))

empty.htmlブロックのプレースホルダーが含まれているだけです:

{% block content %}{% endblock %}

そしてここにあるlogin.html

{% extends extends %}
{% load i18n %}

{% if extends != 'empty.html' %}
    {% block title %}{% trans "Login" %}{% endblock %}
{% else %}
    <div style="display: none;" class="ajax-title">{% trans "Login" %}</div>
{% endif %}

{% block content %}
    {% include "social.html" %}
{% endblock %}

login.htmlまた、 with を使用して含めることができるスニペットに変換する方法があると思います。すなわち{% include 'snippet.html' with extends='base.html' %}

于 2013-02-23T11:27:29.767 に答える