如何为外键启用Django管理界面?

How to enable Django management interface for foreign keys?

https://docs.djangoproject.com/en/1.4/ref/models/relations/ gives model definition and code examples of using one-to-many and many-to-many relationships. But neither the reference nor the tutorial (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)

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

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

如何修改 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 示例仅显示了从问题到选择的一对多映射,并且本教程的 PollAdmin 到 PizzaAdmin 的直接扩展在 OpenShift Origin 3.0 上使用 Django 1.4 失败。

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

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

第 1 步:为文章创建新的 TabularInline class 或 StackedInline class:

class ArticleInline(admin.TabularInline):
    model = Article

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

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

第 3 步:向 ModelClass 注册 ModelAdmin:

admin.site.register(Reporter, ReporterAdmin)

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