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 标签应该被认为是“渲染这个子模板并包含 HTML”的实现,而不是“解析这个子模板并包含它的内容,就好像它是父模板的一部分一样”。这意味着包含的模板之间没有共享状态——每个包含都是一个完全独立的渲染过程。

但我不想将名称放在视图中,title或者将其放置两次。login.htmllogin_ajax.html

4

2 回答 2

0

我认为你需要{% block title %}搬回login.html然后进行两次ajax调用。一个要覆盖{% block ajax_content %},一个要覆盖{% 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。IE{% include 'snippet.html' with extends='base.html' %}

于 2013-02-23T11:27:29.767 回答