Документация Sphinx по шаблонным тегам Django

Я использую Sphinx с autodoc для документирования моего проекта Django.

Дизайнеры хотят иметь страницы документации обо всех тегах шаблонов, которые определены в проекте. Я, конечно, могу сделать такую ​​страничку, перебрав все функции обработки шаблона вручную, но я думаю, что это не СУХОЕ, не так ли? На самом деле все функции обработки тегов шаблона помечены декоратором @register.inclusion_tag. Так что представляется возможным и естественным для какой-то рутины собрать их все и занести в документацию.

То же самое с функциями фильтра.

Я гуглил, искал документацию Django, но тщетно. С трудом верится, что такая естественная функциональность еще кем-то не реализована.


person Hatter    schedule 10.10.2010    source источник


Ответы (3)


Для справки, в Django есть автоматическая система документирования (добавьте django.contrib.admindocs к INSTALLED_APPS).

Это даст вам дополнительные представления в панели администратора (обычно в /admin/docs/), которые представляют ваши модели, представления (на основе URL-адреса), теги шаблонов и фильтры шаблонов.

Дополнительную документацию по этому вопросу можно найти в разделе admindocs.

Вы можете взглянуть на этот код, чтобы включить его в свою документацию или в расширения для документации Django.

person Gert    schedule 08.06.2011

На этом я не остановился и реализовал расширение Sphinx autodoc.

Фрагмент 2. Расширение автодокумента Sphinx

"""
    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:
person Hatter    schedule 12.10.2010
comment
Таким образом, преимущество использования этого вместо .. automodule:: будет заключаться в том, что документацию для классов и функций без тега шаблона можно переместить в нижнюю часть страницы? Мне пришлось исправить import_object(), чтобы использовать self.taglib = get_library(self.object.__name__.split('.', -1)), чтобы все заработало. - person akaihola; 08.11.2011

Я решил проблему и хотел бы поделиться своими фрагментами - вдруг они кому-то пригодятся.

Фрагмент 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.

person Hatter    schedule 12.10.2010