我正在使用带有autodoc的Sphinx来记录我的Django项目。
设计人员希望拥有关于项目中定义的所有模板标签的文档页面。当然,我可以通过手工枚举所有模板处理函数来制作这样的页面,但我认为它不是DRY,不是吗?实际上,模板标签处理功能都标有@register.inclusion_tag
装饰器。因此,对于某些例程来说,将它们全部收集起来并放入文档中似乎是可能和自然的。
过滤功能相同。
我用谷歌搜索了它,搜索了Django的文档,但仍然是静脉。我几乎无法相信这样的自然功能还没有被某人实现。
感谢您的任何提示。
答案 0 :(得分:3)
我此时并未停止并实施了Sphinx autodoc扩展。
Snippet 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
,其行为与自动模块非常相似,但仅枚举标记实现函数。
示例:
.. autotaglib:: lib.templatetags.bfmarkup
:members:
:undoc-members:
:noindex:
答案 1 :(得分:1)
为了记录,Django有一个自动文档系统(向django.contrib.admindocs
添加INSTALLED_APPS
)。
这将为管理员提供额外的观看次数(通常位于/admin/docs/
),代表您的模型,观看次数(基于网址),模板标签和模板过滤器。
有关此内容的更多文档可在admindocs section。
中找到您可以查看该代码,将其包含在您的文档中或extensions的Django文档中。
答案 2 :(得分:0)
我解决了这个问题并希望分享我的片段 - 以防它们对某人有用。
Snippet 1.简单的记录器
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
from django.template import get_library
def show_help(libname):
lib = get_library(libname)
print lib, ':'
for tag in lib.tags:
print tag
print lib.tags[tag].__doc__
if __name__ == '__main__':
show_help('lib.templatetags.bfmarkup')
在运行此脚本之前,您应该设置PYTHONPATH环境变量。