从包含的模板中扩展父块,寻找变通方法

时间:2013-02-22 12:15:13

标签: python django django-templates

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

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

2 个答案:

答案 0 :(得分:0)

我认为您需要将{% block title %}移回login.html然后再进行两次ajax调用。一个覆盖{% block ajax_content %},一个覆盖{% block title %}。您可以使用相同的模式覆盖{% block title %},因为您已用于覆盖{% block ajax_content %},但您可能无需实际创建新的title.html模板即可管理。

我看不出任何其他问题。

答案 1 :(得分: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变成一个片段,可以包含在内。即{% include 'snippet.html' with extends='base.html' %}