3

我使用 django admindocs 进行文档处理,基本功能运行良好(我可以访问文档页面,模型被列为文档,help_text 包括在内,等等)。

不幸的是,文档字符串中的 reStructuredText 标记被完全忽略,例如

  • 超链接不会转换为超链接
  • 项目符号列表不是项目符号列表
  • Django 标记,例如 :model:appname.ModelName未解析

我正在使用 Django (1.7) 的开发主干版本

这是我正在使用的文档字符串的示例:

class Adresse(models.Model):

    u"""Postanschrift

    Wird für 
     - Organisationen 
     - Personen 

    genutzt.

    Siehe auch https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations 

    """

    object_id    = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType)
    of           = generic.GenericForeignKey('content_type', 'object_id' )
    ...

当我将上面的文档字符串内容粘贴到 rest 编辑器(我使用http://rst.ninjs.org/)时,一切都按预期工作。

转换适用于文档字符串记录方法,例如

def my_method(self):
    """Docstring Heading

    1. Listitem 1
    2. Listitem 2

    refers to :model:`personen.Person`
    """
    pass

正确转换。

我敢肯定,我错过了一些非常明显的东西,不是吗?

4

1 回答 1

2

那么admindocs模块的行为与 Django 1.4 中的相同。

  • 要从您的 python 文件自动生成可导航文档,Python Sphinx https://www.sphinx-doc.org可能是更好的方法,将生成的文件放在另一个伪静态文件夹中。
    为此,将 sphinx 文档复制到模板文件夹并添加自定义urls(..),并view提供对仅设置为人员限制的文件的访问(例如通过规范装饰器login_requireduser_pases_test.

其他解决方案:

不幸的是,关于第一次使用的文档有些缺乏,例如settings.py参数RESTRUCTUREDTEXT_FILTER_SETTINGS

请放心,为了激活这些过滤器,将在您的 settings.py 和模板中django.contrib.markup'添加到您的设置中。INSTALLED_APPS{% load markup %}

你应该已经docutils安装了。如果未安装,您将不会收到错误消息。在 bash 中使用 linux 时,输入:

if [[ -z `pip freeze | grep docutils` ]];  then sudo easy_install docutils;fi;

直接渲染reStructuredText:

from django import template

class Adresse(models.Model):
    doc = u"""Postanschrift

    Wird für 
     - Organisationen 
     - Personen 
    """
t = template.Template('{% load markup %}{{ contentstr|restructuredtext }}')
c = template.Context({'contentstr': doc})
__doc__ = t.render(c)

您可以通过遍历所有 [relevant] 模型及其__docs__属性来自动执行此操作,以随后将字符串呈现为 reStructuredText,如下所示:

from django.conf import settings
from django.db.models import get_app, get_models
from django import template

for appname in settings.INSTALLED_APPS:
  app = get_app(appname )
  for model in get_models(app):
    if hasattr(model, '__doc__') and model.__doc__ != "":
      t = template.Template('{% load markup %}{{ contentstr|restructuredtext }}')
      c = template.Context({'contentstr': model.__doc__})
      model.__doc__ = t.render(c)
于 2013-10-22T11:38:42.423 回答