在mediawiki中,用户只需输入[[页面名称]]即可链接到页面。在语义mediawiki中,用户可以通过将[[example :: Some Page]]标识为示例页面来与页面建立语义关系。
我希望能够用django模型做到这一点。
例如,我希望用户能够在工作流应用程序中为Task对象编写描述,并添加诸如“跟进[[User.id:43]]之类的内容。”
我也很乐意能够做语义事。
最后,我希望能够查看用户43并查看链接到它的模型。
是否有django包可以完成部分或全部操作?如果没有,这种方法通常被称为什么?
答案 0 :(得分:1)
首先,我设置了以下内容来处理链接检测和创建:
Task
。创建custom validator以对此表单的description
字段进行操作。此验证器将检查用户输入的任何链接是否与您指定的[[:]]格式相对应。 Task
模型上。现在是检查描述内容并根据需要创建链接的好时机。
现在,在save方法中,真正的动作正在发生。我会使用正则表达式来提取所有链接,然后逐个完成它们。
Django有generic foreign keys的标准机制,你应该在这里考虑使用它。您可以创建类似以下链接类:
class Link(models.Model):
# link to particular task:
task = models.ForeignKey(Task)
# these three fields together set up a generic foreign key which
# represents the object you're linking to:
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
然后,您的任务模型对象将自动获取名为link_set
的属性,该属性将是一个链接实例列表。
创建链接看起来像:
# encountered a description with [[User:43]]
instance = User.objects.get(pk=43)
link = Link.objects.create(task=my_task_object, content_object=instance)
通过为链接的content_object
属性提供另一个模型的实例,系统会自动为您填充content_type
和object_id
字段,您的链接将解析回指定的实例。< / p>
希望这有帮助。如果需要,请询问更多细节。