gpt4 book ai didi

django - 关于 Django 模板标签的 Sphinx 文档

转载 作者:行者123 更新时间:2023-12-01 13:04:39 26 4
gpt4 key购买 nike

我使用带有 autodoc 的 Sphinx 来记录我的 Django 项目。

设计人员希望拥有关于项目中定义的所有模板标签的文档页面。当然,我可以通过手动枚举所有模板处理函数来制作这样的页面,但我认为这不是DRY,不是吗?其实模板标签处理函数都是用@register.inclusion_tag装饰器来标记的。因此,某些例程将它们全部收集起来并放入文档中似乎是可能且自然的。

过滤函数也是如此。

我用谷歌搜索过它,搜索过 Django 文档,但一直在寻找。我简直不敢相信这样一个自然的功能还没有被人实现。

最佳答案

我并没有就此停止并实现了 Sphinx autodoc 扩展。

片段 2.Sphinx autodoc 扩展

"""
Extension of Sphinx autodoc for Django template tag libraries.

Usage:
.. autotaglib:: some.module.templatetags.mod
(options)

Most of the `module` autodoc directive flags are supported by `autotaglib`.

Andrew "Hatter" Ponomarev, 2010
"""

from sphinx.ext.autodoc import ModuleDocumenter, members_option, members_set_option, bool_option, identity
from sphinx.util.inspect import safe_getattr

from django.template import get_library, InvalidTemplateLibrary

class TaglibDocumenter(ModuleDocumenter):
"""
Specialized Documenter subclass for Django taglibs.
"""
objtype = 'taglib'
directivetype = 'module'
content_indent = u''

option_spec = {
'members': members_option, 'undoc-members': bool_option,
'noindex': bool_option,
'synopsis': identity,
'platform': identity, 'deprecated': bool_option,
'member-order': identity, 'exclude-members': members_set_option,
}

@classmethod
def can_document_member(cls, member, membername, isattr, parent):
# don't document submodules automatically
return False

def import_object(self):
"""
Import the taglibrary.

Returns True if successful, False if an error occurred.
"""
# do an ordinary module import
if not super(ModuleDocumenter, self).import_object():
return False

try:
# ask Django if specified module is a template tags library
# and - if it is so - get and save Library instance
self.taglib = get_library(self.object.__name__)
return True
except InvalidTemplateLibrary, e:
self.taglib = None
self.directive.warn(unicode(e))

return False

def get_object_members(self, want_all):
"""
Decide what members of current object must be autodocumented.

Return `(members_check_module, members)` where `members` is a
list of `(membername, member)` pairs of the members of *self.object*.

If *want_all* is True, return all members. Else, only return those
members given by *self.options.members* (which may also be none).
"""
if want_all:
return True, self.taglib.tags.items()
else:
memberlist = self.options.members or []
ret = []
for mname in memberlist:
if mname in taglib.tags:
ret.append((mname, self.taglib.tags[mname]))
else:
self.directive.warn(
'missing templatetag mentioned in :members: '
'module %s, templatetag %s' % (
safe_getattr(self.object, '__name__', '???'), mname))
return False, ret

def setup(app):
app.add_autodocumenter(TaglibDocumenter)

这个扩展定义了 Sphinx 指令 autotaglib,它的行为很像 automodule,但只枚举标签实现函数。

例子:

.. autotaglib:: lib.templatetags.bfmarkup
:members:
:undoc-members:
:noindex:

关于django - 关于 Django 模板标签的 Sphinx 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901026/

26 4 0