我有一个包含一些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.html
和login_ajax.html
中放置两次。
答案 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' %}