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示例在此处不起作用,因为它消除了与问题分开管理选择的能力。为了具有可比性,我们应该能够创建一个选择目录(通过管理选择),然后从问题界面中选择适用于该问题但不能修改所选内容的选项。
答案 0 :(得分:3)
InlineModelAdmin就是你想要的。您可以使用StackedInline
或TabularInline
。
第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版本