一个通用类,以便于创建复杂的模板标记。

icm-django-easytag的Python项目详细描述


django easytag
==


一个模板标记实用程序,可以大大简化块样式标记的设计




子类来处理任何自定义的中间标记分隔符(想想"for`/``empty`,``if`/``else`)。

请参见下面的[在标记库中注册](在标记库中注册)了解如何使用此"name"属性而不必重复自己的操作。

此标记将自动解析为匹配的`{%end{name}%}`标记。如果"end_tag"是一个字符串,则它将被视为结束块标记。它也不会添加"end"前缀,所以请选择一个智能名称!

例如,如果使用``intermediate_tags=["除非"]````,则可以在模板中编写类似的内容:

``html
{%my_tag%}
某些内容
{%除非%}
secondary content
{%endmytag%}
``

呈现,但它们被传递给标记类上的单独方法进行处理,允许您动态决定是否或如何呈现同级分支。

如果你想强制执行一个特定的命令,您需要向特定处理程序添加一些逻辑,以验证是否先有其他标记。


这些方法是有效的呈现器;不管是否修改任何内容,都应该返回呈现的内容。

最简单的情况是传递标记:

``python
class my tag(easytag):
name="my_tag"

def my_tag(self,context,nodelist):
return nodelist.render(context)
```


my_tag``标记应该在其自身声明一个名为相同对象的方法。这是打包内容发送到的处理程序。"context"和"nodelist"参数是必需的。

包括纯文本块。

如果定义了中间标记,请注意"包装内容"的定义是如何变化的:

``html
<;!--示例模板使用-->;
{%my_tag%}
some content
{%除非%}
secondary content
{%endmytag%}
````

main``my_tag``方法只接收所有内容,直到下一个中间块,中间块接收所有信息,直到下一个中间块或结束标记,等等。

easytag允许将发送到标记的参数自动转发到标记上的方法。

这包括具有默认值的参数,``*args``和`**kwargs``用于catch all。如果参数丢失或意外,将引发正确的错误。

示例:

`` my tag类中的python
ntext,nodelist,myflag=false:
content=nodelist.render(context)
如果myflag为true:
content="<;div class="hidden">;%s<;/div>;"%(content,)
返回content
````

``html
<;!--在模板中-->;
{属性,它将是模板中使用的名称。这有助于您省去编写单独编译器函数的麻烦,只需将其包装在``@register.tag``decorator中即可。

建议:
mytagclass.register_tag(register)

+1如果您完全是普通的,没有魔法。
register.tag(mytagclass.name,mytagclass.parser)
`````

不能向easytag添加更简单的``register()``方法,因为easytag不会对您的标记的特定库实例有活动引用,因此它将被注册到错误的库在运行时。


\目标用法应该是这样的:

``html
{%my_tag active\u section="second"%}
{%section name="first"%}
一些内容
{%section name="second"%}
更多内容
{%endmy_tag%}
```

保存变量很简单在"my tag"处理程序上(尽管如果在存储状态值之后要修改它们,但是请确保准备好关于templatetag[thread safety]的django文档(https://docs.djangoproject.com/en/dev/howto/custom template tags/thread safety concertients)),一旦你完成了,检查这些值就很简单了:

``python
def my_tag(self,context,nodelist,active_section=none):
self.active_section=active_section


==self.active_节:
active_class="active"
否则:
active_class=
return wrapper%{active':active_class,"content":content}
`````

##包装整个标记输出、追加、前缀等

应该重写标记的内置"render()"方法。默认情况下,此方法在"template.node"对象上提供。"`easytag.render()`"实现迭代所有分支并连接它们的输出。

然后根据需要修改它:

``python
def render(self,context):
content=super(mytag,self)。render(context)
return"<;div id="wrapper">;%s<;/div>;"%content
```

您可能想在标记的末尾追加额外的输出。这在技术上是可能的,如上面所讨论的那样重写``render()``方法,但似乎应该承认结束标记是一个处理程序本身。

不管你设置成什么:

`` python
类my tag(easytag):
name="my_tag"
结束标记=真




def endmy_tag(self,上下文):
return"some trailing content"
```

注意在本例中没有``nodelist``参数,因为结束标记没有它影响的内容。返回一些字符串内容由您决定。

还请注意,当内容最终从"render()"方法返回为单个大字符串时,返回的字符串会自动通过Django通过"django.utils.safe string.mark_safe"发送。

有助于允许中间标记积累一些信息,但在标记结束之前不对其执行操作。



\更新应用程序中的"版本信息"。承诺并推动。
2.用版本标记发布。` git tag<;version>;-m"release";git push——tags`
3。构建发行版"rm-rf dist build*egon info;python setup.py sdist bdist廑wheel"
4。上传数据'tween upload dist/*`



欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Apache Flink外部Jar   创建和强制转换对象数组时发生java错误   Java,添加数组   具有相同包结构和类的java JAR   java Jenkins未能构建Maven项目   java为什么一个forloop比另一个更快,尽管它们做的“一样”?   servlets在将“/”站点迁移到Java EE包时处理contextpath引用   无法解析java MavReplugin:2.21或其某个依赖项   泛型如何编写比较器来泛化Java中的两种类型的对象?   java Android Emulator未在netbeans上加载   多线程Java使用线程对数组中的数字求和:在同步块中使用新变量作为锁:差异   java如何在JSP/servlet中设置<input>标记的值?