天道酬勤,学无止境

替换 {{ super() }} 中的块(replace block within {{ super() }})

问题

我有一个基本模板,其中包含默认<head>内容的块。 在 head 块中,有一个<title>块。

例如,在基本文件中,我将拥有:

<head>
    {% block head %}
    {% block title %}<title>An App</title>{% endblock title %}
    <script src="somescript.js"></script>
    {% endblock head %}
</head>

在子模板中,我想包含来自基础的头块中的所有内容(通过调用{{ super()) }}并包含一些其他内容,但同时替换超级调用中的标题块.

有没有办法做到这一点,而不仅仅是在头部内容的其余部分(不包括标题)周围放置一个块并替换所有这些?

回答1

不要叫super 。 在您的子模板中,您可以执行以下操作:

{% extends "base.html" %}
{% block title %}<title>This is my new TITLE</title>{% endblock %}

Jinja 将父级中的所有块替换为子级中定义的块,如果您不提供新定义,它将使用父级中的定义。 所以它将呈现为:

<head>

    <title>TITLE</title>
    <script src="somescript.js"></script>

</head>

如果你想要父级中块的默认值,你可以调用super

{% extends "base.html" %}
{% block title %}<title>TITLE</title>{{ super() }}{% endblock %}

这呈现为:

<head>

    <title>TITLE</title><title>An App</title>
    <script src="somescript.js"></script>

</head>

如果您想添加更多脚本,只需在基本模板中创建一个占位符块:

<head>
    {% block head %}
    {% block title %}<title>An App</title>{% endblock title %}
    <script src="somescript.js"></script>
    {% block moreScripts %}{% endblock moreScripts %}
    {% endblock head %}
</head>

并使用它:

{% extends "base.html" %}
{% block title %}<title>TITLE</title>{% endblock %}
{% block moreScripts %}
<script src="somescript1.js"></script>
<script src="somescript2.js"></script>
<script src="somescript3.js"></script>
{% endblock moreScripts %}
回答2

笔记:

如果应用程序需要将自己的内容添加到已经有一些内容的块中,那么必须使用Jinja2super()函数。

例如,这就是在派生模板中编写脚本块以向文档添加新JavaScript文件的方式:

{% block scripts %}
  {{ super() }}
  <script type="text/javascript" src="my-script.js"></script> 
{% endblock %}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • python - flask 之 jinja2渲染模块详细介绍
    目录 1.jinja2基础 (1)jinja2作用简介 (2)jinja2渲染模板 (3)jinja2变量与变量过滤器 (4)jinja2控制语句 (5)jinja2宏操作 (6)jinja2 block块 (7)jinja2 include语句 1.jinja2基础 (1)jinja2作用简介 jinja2主要任务是实现html页面的渲染。在flask项目中,业务逻辑由视图函数来完成,而页面逻辑由jinja2渲染模板来完成。jinja2渲染模板通过接收来自视图函数的数据,生成html代码或其他前端框架的代码。 (2)jinja2渲染模板 1)Flask如何使用jinja2渲染模板 Flask提供render_template()函数把jinja2模板引擎集成到应用中;默认情况下,Flask在templates目录里寻找模板。所以jinja2模板应存放在templatesh目录中。 2)Flask使用jinja2模板案例 第一步:在templates目录建 index.html 与 user.html 两模板 index.html模板内宾 <h1>Hello World</h1> user.html模板内容 <h1>Hello,{{name}}!</h1> 第二步:使用render_template()调用模板并传递输入数据 from flask import Flask
  • 识别并替换字符向量中的块重复项(Identify and replace block duplicates in a character vector)
    问题 我有一个字符串向量a 。 a = c("Chemistry", "Chemistry", "Math","English","Math","Math","Physics","Physics","Chemistry") 有没有一种快速简单的方法来制作它如下? c("Chemistry", NA, "Math","English","Math",NA,"Physics",NA,"Chemistry") 我试过diff和duplicated ,没有得到我想要的。 回答1 我们可以比较vector的相邻元素以获得逻辑向量并将那些为TRUE元素分配给NA 。 a[c(FALSE,a[-1]==a[-length(a)])] <- NA a #[1] "Chemistry" NA "Math" "English" "Math" NA "Physics" NA "Chemistry" 或者正如 OP 提到的diff ,可以转换为factor ,将其强制为numeric ,使用diff然后分配给 NA a[c(FALSE,!diff(as.numeric(factor(a))))] <- NA 或者使用duplicated library(data.table) a[duplicated(rleid(a))] <- NA 回答2 这是一种使用rle和replace : replace(a
  • Xcode 自动完成块中块(以及它们所在的块……)(Xcode auto-complete for blocks-within-a-block (and the blocks they're in…))
    问题 如何设置将另一个块属性作为参数的块属性,以便自动完成为两个块提供所有必需的参数? 为了进一步解释,我将演示自动完成如何仅使用一个块属性。 在AppDelegate.h ,创建一个方便的方法来为所有需要访问块属性的类引用 AppDelegate 类: #define AppServices ((AppDelegate *)[[UIApplication sharedApplication] delegate]) 然后,定义块: typedef void (^LogEvent)(NSString *context, NSString *entry, LogTextAttributes logTextAttributes, dispatch_block_t block); 然后,将块指定为属性: @property (copy, nonatomic, readwrite) LogEvent logEvent; 在 AppDelegate.m 中,编写一个返回 ???n 的方法(我不确切知道我要返回什么;我只知道它有效——它是一个块: - (LogEvent)logEvent { return ^(NSString *context, NSString *entry, LogTextAttributes logTextAttributes, dispatch_block_t
  • 如何使用块简化回调逻辑?(How to simplify callback logic with a Block?)
    问题 假设我需要与提供协议并在操作完成时调用委托方法的类进行通信,如下所示: @protocol SomeObjectDelegate @required - (void)stuffDone:(id)anObject; - (void)stuffFailed; @end @interface SomeObject : NSObject { } @end 现在,我决定虽然可以使另一个类实现stuffDone:委托方法,但我决定将进程封装到一个块中,该块写在SomeObject实例化,调用SomeObject地方。我该怎么办? 或者换句话说,如果您查看有关块的著名文章(在“替换回调”部分中); 我如何在SomeObject中编写一个接受completionHandler:的方法? 回答1 听起来您希望与旨在接收委托对象的现有类进行通信。 有多种方法,包括: 使用类别添加适当方法的基于块的变体; 使用派生类添加基于块的变体; 和写一个实现协议并调用您的块的类。 这是一种处理方法(3)。 首先,让我们假设您的SomeObject是: @protocol SomeObjectDelegate @required - (void)stuffDone:(id)anObject; - (void)stuffFailed; @end @interface SomeObject : NSObject
  • 在Django模板中复制数据的最佳方法是什么? [复制](Whats the best way to duplicate data in a django template? [duplicate])
    问题 这个问题已经在这里有了答案: 如何在Django模板中重复一个“块” (14个答案) 5年前关闭。 <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>{% block title %}{% endblock %}</h1> </body> </html> 这或多或少是我的模板。 h1标题始终与标题标签相同。 上面的代码段无效,因为不能有两个具有相同名称的块。 我该如何处理而不重复我自己? 编辑以澄清这一点:我有大量的子模板都是从这个模板继承而来的,因此为每个模板制作一个新的{{title}}变量不是一个很好的解决方案。 以前我是这样设置的: base.html: <title>{% block title %}{% endblock %}</title> 然后在base_view.html(扩展base.html)中: <h1>{% block title %}{% endblock %}</h1> 然后在base_object.html中(扩展base_view.html): {% block title %}my title goes here{% endblock %} 它只是以某种方式起作用。 我重构了模板,因此只有base.html和base_object
  • sed 或 awk 替换块中的一行(Sed or awk to replace a line in a block)
    问题 输入文件包含: [abc] para1=123 para2=456 para3=111 [pqr] para1=333 para2=765 para3=1345 [xyz] para1=888 para2=236 para3=964 shell 脚本的要求是替换特定块的一个参数例如:用块[pqr] para2=999替换para2=765 请帮助我如何使用sed或awk命令实现此目的。 回答1 这可能对你有用(GNU sed): sed '/\[pqr\]/,/^\s*$/s/\(para2=\)[0-9]*/\1999/' file 将块中以[pqr]开头的para2=后面的数字替换为空行。 回答2 惯用的 awk 解决方案是: $ awk 'BEGIN{RS=""; ORS="\n\n"; FS=OFS="\n"} $1=="[pqr]"{$3="para2=999"} 1' file [abc] para1=123 para2=456 para3=111 [pqr] para1=333 para2=999 para3=1345 [xyz] para1=888 para2=236 para3=964 回答3 通过 sed 的另一种方式, $ sed -r ':l /^\[pqr\]/{:loop ;n;/^$/{b l};s/(para2=).*/\1999/g;b
  • 通过与列对应的块的最大值对块间进行归一化(Normalize between-blocks by the maxima of the block corresponding to the columns)
    问题 这个问题是我上一个问题的后续问题,而不是通过局部最大值标准化块,我想通过与列对应的块的最大值来标准化块间。 #dummy data mat <- matrix(round(runif(90, 0, 50),),9,9) rownames(mat) <- rep(LETTERS[1:3],3) colnames(mat) <- rep(LETTERS[1:3],3) #Normalizes within and between blocks by the maxima of the focal block ans <- mat / ave(mat, rownames(mat)[row(mat)], colnames(mat)[col(mat)], FUN = max) #Number of blocks sum(ans == 1) #[1] 9 我想通过与列对应的块的最大值来标准化块间,即AB , AC , BA , BC , CA , CB 。 例如,在AB的情况下,通过BB的max()对其进行归一化,并通过CC的max()等将AC归一化。 > mat[rownames(mat)=="A",colnames(mat)=="B"] B B B A 26 26 14 A 12 11 18 A 44 44 29 > mat[rownames(mat)=="B",colnames
  • 调用 super 时不要传递块(Don't pass block when calling super)
    问题 如何将super调用的块设置为 nil? class A def foo if block_given? result = yield # do stuff with the yield result end # some more code end end class B < A def foo block_result = yield # process block results and store it # ... super end end B.new.foo { puts "block called" } # => block called # => block called 我不想让块两次。 block_given?以某种方式可能block_given? 在A类中返回 false? 背景是我不拥有A类,我无法更改它的foo方法,但我想避免两次调用我的块。 我也不想将一个虚拟/空块传递给 super,因为A的foo方法的行为在给定块时会发生变化。 回答1 其实没那么明显。 从文档中我们知道: 调用super传递所有参数调用super()传递参数 文档没有说的是这仅适用于位置和关键字参数。 super()仍然通过给定的块! 您必须通过调用显式取消设置块: super(&nil) 这是如何运作的? 您可能知道可以使用显式块参数定义方法: def foo(&block)
  • 保留带有块的`self`上的循环(Retain cycle on `self` with blocks)
    问题 恐怕这个问题是很基本的,但是我认为这与许多进入块的Objective-C程序员有关。 我所听到的是,由于块将在其中引用的局部变量捕获为const副本,因此,如果要复制该块,则在块内使用self会导致保留周期。 因此,我们应该使用__block强制该块直接处理self而不是将其复制。 __block typeof(self) bself = self; [someObject messageWithBlock:^{ [bself doSomething]; }]; 而不只是 [someObject messageWithBlock:^{ [self doSomething]; }]; 我想知道的是以下内容:如果是这样,是否有办法避免丑陋(除了使用GC外)? 回答1 严格来说,它是一个const副本这一事实与该问题无关。 块将保留创建时捕获的所有obj-c值。 碰巧,const复制问题的解决方法与保留问题的解决方法相同。 也就是说,使用__block存储类作为变量。 无论如何,要回答您的问题,这里没有真正的选择。 如果您正在设计自己的基于块的API,并且这样做很有意义,则可以让该块将self的值作为参数传递给它。 不幸的是,这对于大多数API来说都没有意义。 请注意,引用一个ivar具有完全相同的问题。 如果需要在块中引用ivar,请改用属性或使用bself->ivar 。 附录
  • Rust模板引擎Tera中文英文对照官方文档
    来嘞早不如来的巧,刚翻译好,你就来啦!翻译完成 要开发CMS(内容管理系统)得有个模板引擎,Tera是使用Rust编写的模板引擎,语法跟JinJa2很像。 引入Tera 要使用Tera只需要在 Cargo.toml中添加: tera = "1" 是不是很简单^_^?默认情况下, Tera会引入一些依赖比如: truncate, date, filesizeformat slugify, urlencode 和 urlencode_strict ,这些依赖是某些过滤器(后面会讲解)要用的. 如果你确定不需要可以在 Cargo.toml中这么配置: [dependencies.tera] version = "1" default-features = false 如果你用的Rust不是2018版本的(你最好使用),你需要在lib.rs或者main.rs文件中写上 And add the following to your lib.rs or main.rs if you are not using Rust 2018: extern crate tera; 2018版本就不需要这样写了,原因可以参考零基础学新时代编程语言Rust如果想了解Tera的API可以看API文档 You can view everything Tera exports on the API docs
  • replace block within {{ super() }}
    I have a base template which includes a block for the default <head> content. Within the head block, there's a block for the <title>. For example, in the base file I would have: <head> {% block head %} {% block title %}<title>An App</title>{% endblock title %} <script src="somescript.js"></script> {% endblock head %} </head> In the child template, I would like to include everything that was in the head block from the base (by calling {{ super()) }} and include some additional things, yet at the same time replace the title block within the super call. Is there a way to do this without just
  • 在 Ruby 中合并多维哈希(Merging multi-dimensional hashes in Ruby)
    问题 我有两个散列,它们的结构与此类似: hash_a = { :a => { :b => { :c => "d" } } } hash_b = { :a => { :b => { :x => "y" } } } 我想将这些合并在一起以产生以下哈希: { :a => { :b => { :c => "d", :x => "y" } } } 合并函数将第一个散列中 :a 的值替换为第二个散列中 :a 的值。 因此,我编写了自己的递归合并函数,如下所示: def recursive_merge( merge_from, merge_to ) merged_hash = merge_to first_key = merge_from.keys[0] if merge_to.has_key?(first_key) merged_hash[first_key] = recursive_merge( merge_from[first_key], merge_to[first_key] ) else merged_hash[first_key] = merge_from[first_key] end merged_hash end 但是我收到一个运行时错误: can't add a new key into hash during iteration 。 在 Ruby
  • 我们可以附加到{%block%}而不是覆盖吗?(Can we append to a {% block %} rather than overwrite?)
    问题 在我的core.html中,有一个标有javascript的块。 如果可以在此块上添加更多行而不会覆盖其中的所有内容,那将是很好的。 回答1 {% block javascript %} {{ block.super }} ... more content ... {% endblock %} 请参阅:Django文档-模板继承 回答2 扩展模板时,使用block.super可以很好地工作,但包括模板时,效果不佳,即: {% extends "base.html" %} vs. {% include "partial.html" %} 假设您要在页面中间添加一个模板,并且还希望它在页面末尾的一个块中添加一些javascript:在包含的模板中调用block.super将会崩溃。 cf. Django问题#7324,#12008,#13399和文档的相关更新。 cf. 包括标签说明: include标签应被视为“呈现此子模板并包含HTML”的实现,而不应被视为“解析此子模板并像其父对象一样包含其内容”。 这意味着在包含的模板之间没有共享状态–每个包含都是一个完全独立的呈现过程。 在包含块之前先对其进行评估。 这意味着包含另一个块的模板将包含已经被评估和渲染的块,而不是可以被例如扩展模板覆盖的块。 在这种情况下,我建议您使用django-sekizai,它可以让您执行以下操作:
  • 与python中的“意外缩进”怎么办?(What to do with “Unexpected indent” in python?)
    问题 如何纠正python中的“意外缩进”错误? 回答1 Python在行的开头使用空格来确定代码块的开始和结束时间。 您会得到的错误是: 意外缩进。 这行代码的开头比以前的空格多,但前面的不是子块的开头(例如if / while / for语句)。 块中的所有代码行必须以完全相同的空白字符串开头。 例如: >>> def a(): ... print "foo" ... print "bar" IndentationError: unexpected indent 当以交互方式运行python时,这一点尤其常见:请确保在命令前不要放置任何多余的空格。 (在复制粘贴示例代码时非常烦人!) >>> print "hello" IndentationError: unexpected indent Unindent与任何外部缩进级别都不匹配。 此代码行的开头比以前的空格要少,但是同样,它也不匹配可能包含的任何其他块。 Python无法决定它的去向。 例如,在下面,最终的打印是否应该包含在if子句中? >>> if user == "Joey": ... print "Super secret powers enabled!" ... print "Revealing super secrets" IndendationError: unindent does not match any
  • 虚拟文件系统VFS(上)
    Linux中断和中断处理程序 虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统依赖VFS共存、协同工作,程序利用标准的Unix系统调用对不同的文件系统,甚至不同介质的文件系统进行读写操作。 1 通用文件系统接口 VFS使得用户可以直接使用Open()、read()、write()这样的系统调用而无须考虑具体文件系统和实际物理介质。 VFS将各种不同的文件系统抽象后采用统一的方式进行操作。同时与块I/O结合,提供抽象、接口以及交融,使得用户空间的程序调用统一的系统调用访问各种文件。 2 文件系统抽象层 之所以可以使用通用接口对所有类型的文件系统进行操作,是因为内核在底层文件系统接口上建立了一个抽象层,使得Linux能够支持各种文件系统。 为了支持多文件系统,VFS提供了一个通用文件系统模型,该模型概括了任何文件系统的常用功能集和行为。 VFS抽象层之所以能够衔接各种各样的文件系统,是因为它定义了所有文件系统都支持基本的、概念上的接口和数据结构。同时文件系统也将诸多行为在形式上与VFS的定义保持一致。实际文件系统的代码在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS层和内核的其余部分看来,所有文件系统都是相同的。 内核通过抽象层能够方便的支持各种各样的文件系统,实际的文件系统通过编程提供给VFS所希望的抽象接口和数据结构。
  • Usemin 不替换 HTML 中的引用块(Usemin not replacing reference blocks in HTML)
    问题 我可以看到 css 和 js 文件正确地连接、加速并复制到正确的文件夹中。 但是,最后一步,即 usemin 替换 html 文件中的块和图像,由于某种原因不起作用。 css 文件中的图像引用确实被替换了。 Gruntfile.js: useminPrepare: { html: '<%= yeoman.app %>/index.html', options: { dest: '<%= yeoman.dist %>' } }, // Performs rewrites based on rev and the useminPrepare configuration usemin: { css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], html: ['<%= yeoman.dist %>/{,*/}*.html'], options: { assetsDirs: ['<%= yeoman.dist %>/images', '<%= yeoman.dist %>/styles', '<%= yeoman.dist %>/scripts'] } }, 在 Html 我有: <!-- build:css styles/main.css --> <link rel="stylesheet" href="Styles/main.css">
  • 替换 viewpager 中的片段(Replacing fragments within viewpager)
    问题 我目前在用另一个替换 ViewPager 中的某个片段时遇到问题。 想要替换的片段 id 是我的“部门”,它有一个 Imagebutton id 喜欢用来开始替换。 我尝试应用来自其他类似问题的一些建议(其中大部分是旧的,并且在允许嵌套片段的新 api 版本之前)并且没有成功。 使用嵌套片段会更容易吗? 我是 android 应用程序开发的新手,所以任何帮助都会很棒。 提前致谢。 这是我的 FragmentAcitivty public class ViewPagerStyle extends FragmentActivity { private ViewPager mViewPager; private ViewPagerAdapter adapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setUpView(); setTab(); } private void setUpView(){ mViewPager = (ViewPager)
  • dispatch_async 中的同步块(synchronized block within dispatch_async)
    问题 我已经看到将异步调度到主队列或私有调度队列(串行)的代码,然后在调度代码块中是@synchronized。 你想在什么情况下这样做? 串行队列不是已经提供了所需的同步吗? 可以用另一个 GCD 调度替换同步块吗? 回答1 @synchronized()确保包含的代码(对于给定的标记作为@synchronized的参数)一次只在一个线程上运行。 提交到串行队列的块一次执行一个,即。 一个给定的块在它完成执行之前提交的所有块之前不会执行。 只要共享资源只能从串行队列上运行的代码访问,就不需要同步/锁定对它的访问。 然而,仅仅因为给定队列是串行的,并不意味着其他队列/线程(甚至是串行队列!)不会同时运行,并访问相同的共享资源。 使用@synchronized()是防止这些多个线程/队列同时访问资源的一种方法。 请注意,所有访问共享资源的代码都需要用@synchronized()包装。 是的,您可以使用另一个 GCD 调度来代替同步块。 这样做的“GCD 方式”是使用串行队列序列化对共享资源的所有访问。 因此,任何时候需要访问共享资源时,您都可以将该代码(根据用例使用dispatch_sync()或dispatch_async() dispatch_sync() dispatch_async()到与资源关联的串行队列。 当然,这意味着资源访问队列必须对访问共享资源的程序的所有部分可见
  • Completion Handler 和 Blocks 的区别:[iOS](Difference Between Completion Handler and Blocks : [iOS])
    问题 当我在Swift和Objective-C使用它们时,我对完成处理程序和块都感到困惑。 当我在谷歌的Swift搜索块时,它显示了完成处理程序的结果! 有人能告诉我就Swift和Objective-C而言,完成处理程序和块之间有什么区别吗? 回答1 在这里,您可以轻松区分块和完成处理程序,实际上它们都是块,请参阅下面的详细信息。 块: 块是添加到 C、Objective-C 和 C++ 的语言级功能,它允许您创建不同的代码段,这些代码段可以像值一样传递给方法或函数。 块是 Objective-C 对象,这意味着它们可以添加到像 NSArray 或 NSDictionary 这样的集合中。 它们可以在以后执行,而不是在执行它们的范围内的代码时执行。 它们的使用最终会导致代码编写更加清晰和整洁,因为它们可以代替委托方法使用,只在一个地方编写,不会扩展到许多文件。 语法: ReturnType (^blockName)(Parameters)参见示例: int anInteger = 42; void (^testBlock)(void) = ^{ NSLog(@"Integer is: %i", anInteger); // anInteger outside variables }; // calling blocks like testBlock(); 带参数的块: double
  • IntelliJ IDEA for Mac 在eclipse(MacOS)模式下的快捷键
    文章目录 Mac键盘符号eclipse(MacOS)模式下的快捷键General 通用Debugging 调试Search/ Replace 查询/替换Editing 编辑Refactoring 重构Navigation 导航Usage Search 使用查询VCS/ Local History 版本控制/本地历史记录Live Templates 动态代码模板Other 官方文档上没有体现 Mac键盘符号 图标介绍⌘Command⇧Shift⇪Caps Lock⌥Option = Alt⌃Control↩Enter⌫Delete⌦Fn + Delete↑上箭头↓下箭头←左箭头→右箭头⇞Fn + ↑ = Page Up⇟Fn + ↓ = Page DownHomeFn + ←EndFn + →⇥Tab = 右制表符⇤Shift + Tab = 左制表符⎋Esc = Escape⏏电源开关键 eclipse(MacOS)模式下的快捷键 General 通用 快捷键快捷键符号英文名称功能说明Command + 0...Command + 9⌘0…⌘9Open corresponding tool window打开相应编号的工具窗口Command + S⌘SSave all保存所有Command + Option + Y⌘⌥YSynchronize同步、刷新Command + Shift