Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从包含的模板扩展父块,寻找解决方法_Python_Django_Django Templates - Fatal编程技术网

Python 从包含的模板扩展父块,寻找解决方法

Python 从包含的模板扩展父块,寻找解决方法,python,django,django-templates,Python,Django,Django Templates,我有一个带有一些ajax页面的站点。如果用户在浏览器中键入/login/,则应获得从基本模板扩展而来的完整呈现模板。但如果用户单击登录按钮,$('#content').ajax('/login/')已调用,因此我不需要呈现完整的模板 也就是说,我有这个(login\u ajax.html): 在login.html中: {% load i18n %} {% block title %} {% trans "Login" %} {% endblock %} {% block conte

我有一个带有一些ajax页面的站点。如果用户在浏览器中键入
/login/
,则应获得从基本模板扩展而来的完整呈现模板。但如果用户单击登录按钮,
$('#content').ajax('/login/')已调用,因此我不需要呈现完整的模板

也就是说,我有这个(
login\u ajax.html
):

login.html
中:

{% load i18n %}

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

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

{% block ajax_content %}
{% include "login_ajax.html" %}
{% endblock %}
{% 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 %}
简单登录视图:

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\u ajax.html
中放置两次。

我认为您需要将
{%block title%}
移回
login.html
中,然后进行两次ajax调用。一个用于覆盖
{%block ajax\u content%}
,另一个用于覆盖
{%block title%}
。您可以使用与覆盖
{%block title%}
相同的模式来覆盖
{%block ajax\u content%}
,但您可能不需要实际创建新的
title.html
模板就可以进行管理


我看不出有什么办法可以解决你的问题。

好的,我找到了一个简单的解决办法。事实上,问题在于:“到底是从基础上延伸,还是不延伸”

事实上,我不关心应该扩展什么
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

{% load i18n %}

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

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

{% block ajax_content %}
{% include "login_ajax.html" %}
{% endblock %}
{% 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 %}
{%extends%}
{%load i18n%}
{%if extends!='empty.html%}
{%block title%}{%trans“登录”%}{%endblock%}
{%else%}
{%trans“登录”%}
{%endif%}
{%block content%}
{%include“social.html”%}
{%endblock%}

另外,我想,有一种方法可以将
login.html
转换为一个片段,可以使用包含在中。i、 e.
{%include'snippet.html',extends='base.html%}

{%block title%}已在
登录\u ajax.html
中。我需要
login.html
来扩展“base.html”。这意味着,如果请求是_ajax,它将只返回login_ajax.html,如果不是,
login.html
将包含来自
login_ajax.html
的公共代码,并从
base.html
扩展,这将提供整个页面。另外,如果你看到更简单的解决方案,我很高兴你能告诉我。好的,但我还是不明白这个问题。你到底犯了什么错误?输出页面中是否有不应该出现的文本?是否有应该是但不是的文本?您的输出页面中是否有显示错误的内容?在呈现
login.html
时,我需要从
login\u ajax.html
中获取
{%block content%}
已在
base.html
中呈现。但根据文档,包含模板中的块被忽略,因此我需要另一种方法从包含模板中重新定义父块。