【问题标题】:How to enable Django management interface for foreign keys?如何为外键启用 Django 管理界面?
【发布时间】:2015-07-10 21:39:47
【问题描述】:

https://docs.djangoproject.com/en/1.4/ref/models/relations/ 给出了使用一对多和多对多关系的模型定义和代码示例。但是参考资料和教程 (https://docs.djangoproject.com/en/1.4/intro/tutorial02/) 都没有提供任何外键管理示例。

使用关系示例中的以下模型:

class Reporter(models.Model):
    name = models.CharField()

class Article(models.Model):
    title = models.CharField()
    reporter = models.ForeignKey(Reporter)

class Topping(models.Model):
    flavor = models.CharField()

class Pizza(models.Model):
    type = models.CharField()
    toppings = models.ManyToManyField(Topping)

(每个模型都包含 unicode() def,为简洁起见省略。)在admin.py中注册每个模型后:

admin.site.register(Reporter)
admin.site.register(Article)
admin.site.register(Topping)
admin.site.register(Pizza)

管理界面允许创建四种类型中的每一种的实例。管理文章时,它会显示一个选项列表来选择记者。但是在管理记者时,没有文章列表。

类似地管理比萨会显示配料选择列表,但管理配料不会显示使用该配料的比萨类型列表。

如何修改 admin.py 以启用reporter.article_settopping.pizza_set 关系的自动管理?

------------ 编辑 ------------

为了简化问题,我过于简单化了。我使用的实际披萨模型和管理界面是:

class Topping(models.Model):
    flavor = models.CharField(max_length=32)
    quantity = models.IntegerField()

def __unicode__(self):
    return self.flavor

class Pizza(models.Model):
    type = models.CharField(max_length=32)
    toppings = models.ManyToManyField(Topping)
    price = models.DecimalField(max_digits=5, decimal_places=2)

def __unicode__(self):
    return self.type

class ToppingInline(admin.TabularInline):
    model = Topping
    extra = 3

class PizzaAdmin(admin.ModelAdmin):
    filedsets = [(None,  {'fields':['type', 'price']})]
    inlines = [ToppingInline]

admin.site.register(Topping)
admin.site.register(Pizza, PizzaAdmin)

和我使用的文章/记者模型类似 - 多对多字段,因为一个记者可以有多篇文章,一篇文章可以有多个作者。本教程中的 Poll 示例仅显示了从问题到选择的一对多映射,并且在 OpenShift Origin 3.0 上使用 Django 1.4 将教程的 PollAdmin 直接扩展为 PizzaAdmin 失败。

那么,是否有一些关于如何编写与 ManyToManyField 一起使用的 admin.py 的指导或教程? Poll 示例在这里不起作用,因为它消除了将选择与问题分开管理的能力。为了具有可比性,应该能够创建一个选项目录(通过管理选项),然后从问题界面能够选择哪些选项适用于问题,但不能修改选项的内容。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    InlineModelAdmin 是你想要的。您可以使用StackedInlineTabularInline

    第 1 步:为文章创建一个新的 TabularInline 类或 StackedInline 类:

    class ArticleInline(admin.TabularInline):
        model = Article
    

    第 2 步:使用上面创建的内联为 Reporter 创建一个 ModelAdmin 类:

    class ReporterAdmin(admin.ModelAdmin):
        inlines = [
            ArticleInline,
        ]
    

    第 3 步:向 ModelClass 注册 ModelAdmin:

    admin.site.register(Reporter, ReporterAdmin)
    

    顺便说一句:你应该真的从 1.4 升级到更新的 Django 版本

    【讨论】:

    • 很好的答案。我喜欢这样。谢谢。
    • 谢谢 - 我会试试的。我使用过 TabularInline 并认为它改变了格式,但没有改变可以编辑的内容。至于版本,由于我的 Django 托管在我无法控制的私有 OpenShift Origin 上,因此我对他们所支持的内容非常坚持。
    • 谢谢,虽然您的示例不适用于我的问题(请参阅已编辑的问题),但引用导致 Working with many-to-many models (docs.djangoproject.com/en/1.4/ref/contrib/admin/…) 这正是我所需要的。
    猜你喜欢
    • 2019-06-15
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2018-02-12
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多