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

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

Момчетата от дизайна искат да имат страница(и) с документация за всички шаблонни тагове, които са дефинирани в проекта. Разбира се, мога да направя такава страница, като изброя на ръка всички функции за обработка на шаблони, но мисля, че не е СУХА, нали? Всъщност всички функции за обработка на етикети на шаблони са маркирани с @register.inclusion_tag декоратор. Така че изглежда възможно и естествено за някаква рутина да ги събере всички и да ги постави в документация.

Същото и за филтърните функции.

Търсих го в Google, търсих в документацията на Django, но в духа. Трудно мога да повярвам, че такава естествена функционалност не е внедрена от някой.


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


Отговори (3)


За протокола Django има автоматична система за документиране (добавете django.contrib.admindocs към вашите INSTALLED_APPS).

Това ще ви даде допълнителни изгледи в администратора (обикновено на /admin/docs/), които представляват вашите модели, изгледи (на базата на URL), шаблонни тагове и шаблонни филтри.

Повече документация за това можете да намерите в раздела за административни документи.

Можете да погледнете този код, за да го включите във вашата документация или на разширения за документацията на Django.

person Gert    schedule 08.06.2011

Не спрях до този момент и внедрих разширение Autodoc на Sphinx.

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