【发布时间】: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_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 示例仅显示了从问题到选择的一对多映射,并且在 OpenShift Origin 3.0 上使用 Django 1.4 将教程的 PollAdmin 直接扩展为 PizzaAdmin 失败。
那么,是否有一些关于如何编写与 ManyToManyField 一起使用的 admin.py 的指导或教程? Poll 示例在这里不起作用,因为它消除了将选择与问题分开管理的能力。为了具有可比性,应该能够创建一个选项目录(通过管理选项),然后从问题界面能够选择哪些选项适用于问题,但不能修改选项的内容。
【问题讨论】:
标签: python django django-admin