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

时间:2015-07-10 21:39:47

标签: python django django-admin

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示例在此处不起作用,因为它消除了与问题分开管理选择的能力。为了具有可比性,我们应该能够创建一个选择目录(通过管理选择),然后从问题界面中选择适用于该问题但不能修改所选内容的选项。

1 个答案:

答案 0 :(得分:3)

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

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

class ArticleInline(admin.TabularInline):
    model = Article

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

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

步骤3:使用ModelClass注册ModelAdmin:

admin.site.register(Reporter, ReporterAdmin)
Btw:您应该真正从1.4升级到更新的Django版本