在Django Admin中从另一个模型中管理一个模型

时间:2011-05-25 14:56:33

标签: django django-admin

这可能甚至不可能,但有些事情告诉我,我还没有找到办法做到这一点。作为一个简化的例子,我将使用博客的概念。

在更改列表视图中,有多个博客。我选择一个博客进行编辑,从更改视图中,我看到属于该博客的帖子更改列表。当我从那里添加/编辑帖子时,它通过URL或其他传递上下文的方式知道它属于哪个博客。

我知道如何设置管理模板来实现我想要的,但我不能为我的生活弄清楚如何将上下文对象的id传递给子对象的视图。有什么建议吗?

修改

对不起伙计们。基于我得到的答案,我必须不够具体。

内联不是我想要的。每个子对象都包含大量数据。使用内联会导致页面永远滚动,无法轻松访问特定对象。我需要有一个更改列表样式的外观(内联所在的位置),然后单击一个链接,将获取该对象的正常更改视图,同时以某种方式将上下文对象的id传递给视图。

例如。如果我去了一个特定的博客,网址将是:

/admin/blog/blog/1/

然后,从那里我点击一个帖子,我发送的URL就像:

/admin/blog/blog/1/post/1/

博客ID(此示例中为1)将可用于post对象,以便我可以保存其博客外键。这也不一定是由URL完成的。我只需要一些方法来为正在编辑的帖子提供上下文,它在具有该id的博客的上下文中。

3 个答案:

答案 0 :(得分:1)

传递parent_id的问题仅与“创建新”页面有关,对吧?对于任何现有模型,我们已经知道这个id。

让我们将问题分成两部分:  1.将parent_id传递给新页面  2.在新页面上阅读parent_id并相应地修改表单

良好的强大解决方案将涉及修改父模型和子模型的管理视图。考虑到源代码时这些视图的复杂程度,需要做太多工作。所以,我个人会解决快速而肮脏的JS黑客攻击:

  1. 将parent_id作为get参数添加到更改列表中的链接。

    $("#changelists_container .link_class").each(function(i,link){
      link.attr("href", link.attr("href") + "?parent_id=" parentId; // assumes no other GET params
    });
    
  2. 在子页面上,如果GET参数中有parent_id,请使用JS设置字段值。这仍然允许用户稍后更改它。如果您不希望字段值更改,请禁用该字段并创建具有相同名称的新隐藏字段,并将parent_id作为值。

答案 1 :(得分:0)

您想要从管理员中链接到更改视图吗?这应该有所帮助:

{% url admin:app_model_change object.pk %}

答案 2 :(得分:0)

查看管理员内联:http://docs.djangoproject.com/en/1.3/ref/contrib/admin/#inlinemodeladmin-objects

它们允许您将子对象添加到父对象的详细信息页面。