如何为外键启用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_set
和 topping.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就是你想要的。您可以使用 StackedInline
或 TabularInline
.
第 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 版本
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_set
和 topping.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就是你想要的。您可以使用 StackedInline
或 TabularInline
.
第 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 版本