Django:我怎样才能让用户定义对象之间的语义关系?

时间:2011-07-08 17:01:25

标签: django django-models markup semantic-markup

在mediawiki中,用户只需输入[[页面名称]]即可链接到页面。在语义mediawiki中,用户可以通过将[[example :: Some Page]]标识为示例页面来与页面建立语义关系。

我希望能够用django模型做到这一点。

例如,我希望用户能够在工作流应用程序中为Task对象编写描述,并添加诸如“跟进[[User.id:43]]之类的内容。”

我也很乐意能够做语义事。

最后,我希望能够查看用户43并查看链接到它的模型。

是否有django包可以完成部分或全部操作?如果没有,这种方法通常被称为什么?

1 个答案:

答案 0 :(得分:1)

首先,我设置了以下内容来处理链接检测和创建:

  1. 创建一个ModelForm以接收用户提交的Task。创建custom validator以对此表单的description字段进行操作。此验证器将检查用户输入的任何链接是否与您指定的[[:]]格式相对应。
  2. {li> Override the save methodTask模型上。现在是检查描述内容并根据需要创建链接的好时机。

    现在,在save方法中,真正的动作正在发生。我会使用正则表达式来提取所有链接,然后逐个完成它们。

    1. 对于每个链接,您需要确定链接到的模型。使用键入其名称的模型字典可以很容易。
    2. 您需要确定链接是否确实标识了有效的模型实例。如果没有,请跳过此链接或引发异常并从整个过程中弹出(请参阅上面有关交易的内容)。
    3. 您需要创建链接。见下文。
    4. 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_typeobject_id字段,您的链接将解析回指定的实例。< / p>

      希望这有帮助。如果需要,请询问更多细节。