【问题标题】:Model with recursive self relation in Django's admin在 Django 的管理员中具有递归自关系的模型
【发布时间】:2011-09-30 19:48:09
【问题描述】:

假设我们有一个具有两个自递归关系的模型:

class Article(Item): # Item in this case is an abstract class
    date = models.DateField()
    parent = models.OneToOneField('self', null=True, blank=True)
    subatricles = models.ForeignKey('self', null=True, blank=True, related_name='subs')

Article 在这里充当一个节点 - 它可以有多个子节点(如果提供)和一个父节点(如果有)。但是,当我在 Django 的管理员中注册我的模型时,我的 subatricles 显示为“一对一” - 在这两种情况下都有选择框,但在后者中,不能选择多个值。

如何通过管理窗格将子项添加到此 Article 对象并稍后列出它们?

我想要的是: 而不是普通的下拉菜单。

谢谢。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您只需要一个字段 parentsubarticles 作为related_name 来提供反向查找:

    class Article(Item): # Item in this case is an abstract class
        date = models.DateField()
        parent = models.ForeignKey('self', null=True, blank=True, related_name='subarticles')
    

    因此,如果您有一个文章对象并且想要获取其父对象,请使用:

    article.parent
    

    如果你想得到它的孩子,你可以使用:

    article.subarticles
    

    在管理界面显示子条目最简单的方法是使用InlineModelAdmin

    class ArticleInline(admin.StackedInline):
        model = Article
    
    class ArticleAdmin(admin.ModelAdmin):
        inlines = [
            ArticleInline,
        ]
    

    【讨论】:

    • 非常感谢您的解释 - 它对我帮助很大。不过,我有一个小问题(我希望是最后一个)。如果我指定要显示的字段:fieldsets = [(None, {'fields': ... 'parent', 'subatricles']})' Django 向我显示ImproperlyConfigured at ... 'ArticleAdmin.fieldsets[0][1]['fields']' refers to field 'subarticles' that is missing from the form. 我怎样才能避免这种情况?我希望能够将现有文章添加到文章的子项中,从多选框中选择它们。
    • @Up - 我需要与此处类似的解决方案:link 用于 Django Admin 中的 ManyToMany 问题:
    • 您将能够将子项添加到文章中,这就是“内联”的用途。顺便说一句,如果您只有一个字段集,则根本不需要指定它。完全从您的管理员中取出“字段集”,它现在可以工作了吗?
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 2014-03-15
    • 2019-09-19
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多