Django:从模型管理员到文档的超链接



我有一个广泛使用django管理界面的应用程序。

管理 GUI 中的某些内容需要解释(特定于域/模型的文档(。

我们使用狮身人面像,屏幕截图确实解释了细节。

是否有一种通用/自动的方法来创建从模型实例的 django 管理界面到文档中匹配部分的超链接?

我知道我可以更改模型的管理模板,但不知何故,我想有人知道如何以更专业的方式解决这个问题。

就我而言,文档托管在同一台服务器上。AFAIK 如果你有一个远大的梦想,那么这也是需要的,从文档到django应用程序的链接(但这是一个不同的问题(。

"文档中的匹配部分"是什么意思?

想象一下,我有一个名为"Foo"的模型。

我有模型的文档(包括图像(。

现在我想有一个从模型的管理页面到模型"Foo"文档的超链接。

我认为这是一个非常普遍的问题。我认为很遗憾框架和第三方应用程序都无法帮助编写集成文档。

这是我用来在管理站点中为特定模型创建链接的方法。

class YourModelAdmin(admin.ModelAdmin):
def link_to_doc(self,obj):
link = 'https://www.stackoverflow.com'
return u'<a href="%s">%s</a>' % (link, "Link Name")
link_to_doc.allow_tags = True
link_to_doc.short_description = "Link Description for admin"
fields = (
'your_model_fields',
'link_to_doc'           
)
readonly_fields = (
'your_model_readonly_fields',
'link_to_doc'           
)

admin.site.register(YourModel, YourModelAdmin)

不知道该告诉你什么,但是你如何使用随附的电池:

Django 的 admindocs 应用程序从INSTALLED_APPS中任何应用程序的模型、视图、模板标签和模板过滤器的文档字符串中提取文档,并从 Django 管理员提供该文档。

由于您的文件位于 .rst 中,而不是使用 sphinx-autodoc 的文档字符串(链接以供考虑(,您仍然可以使用此机制,方法是提供一点帮助字符串作为类文档,然后链接到更详细的文档:

class Joy(models.Model):
"""
The purpose of this model is to provide you with daily joy.
How to achieve this is  outlined in the
`documentation <https://docs.example.com/models/Joy>`_.
"""

这个问题是特定的,据我所知,Django 很可能没有提供开箱即用的解决方案。

但是,由于要求在模型管理器中提供链接 (URL(,因此可以使用模型类中的虚拟属性轻松完成此操作。

我们有一个模型Foo

class Foo(models.Model):
bar = models.CharField(max_length=255)
baz = models.IntegerField()

和模型管理FooAdmin

class FooAdmin(admin.ModelAdmin):
list_display = ('bar', 'baz')
fields = ('bar', 'baz')

现在,我们要提供指向管理员文档的链接。 假设文档是从.rst文件自动生成并遵循通用 URL 模式,则文档可以在如下所示的链接下获得:

http://localhost:8000/docs/foo/

最终,URL在urls.py中定义如下(伪代码(:

url(r'docs/(?P<model>w+)/$', ViewClass.as_view(), name='docs')

考虑到这些假设,我们将以下内容添加到模型类中:

from django.db import models
from django.utils.html import format_html
from django.urls import reverse
class Foo(models.Model):
bar = models.CharField(max_length=255)
baz = models.IntegerField()
@property
def docurl(self):
url = reverse('docs')
return format_url(
'<a href="{url}">{model}</a>',
url=url,
model=self._meta.model_name
)

在模型管理中,我们可以将属性docurl用作只读字段:

class FooAdmin(admin.ModelAdmin):
list_display = ('bar', 'baz')
fields = ('bar', 'baz', 'docurl')
readonly_fields = ('docurl',)

由于属性docurl将在所有模型中使用,因此最好为项目创建一个基模型类,在其中创建属性,并让所有其他模型类继承自该类。

您的实际案例可能与此示例不同,但基本思想是在模型属性中检索/生成文档 URL,然后将该属性用作模型管理员中的只读字段。

与其他解决方案(建议直接在模型管理器中生成 url(相比,其优势是将业务逻辑放入模型中。通过这种方式,文档可以在许多不同的地方使用。

最新更新