2011-12-22 26 views
8

说我有一些Django模型,这样的事情:反向内联同多个模型

class Address(models.Model): 
    pass 

class Person(models.Model): 
    address = models.ForeignKey(Address) 

class Store(models.Model): 
    address = models.ForeignKey(Address) 

class Company(models.Model): 
    address = models.ForeignKey(Address) 

所以,在管理界面中,我希望能够编辑和人地址已内联。

我知道这是可能做到这一点,

class Address(models.Model): 
    person = models.ForeignKey(Person, blank=True) 
    store = models.ForeignKey(Store, blank=True) 
    company = models.ForeignKey(Company, blank=True) 

class Person(models.Model): 
    pass 

class Store(models.Model): 
    pass 

class Company(models.Model): 
    pass 

然后,我可以做平常,

class AddressInline(admin.TabularInline): 
    model = Address 

class PersonAdmin(admin.ModelAdmin): 
    model = Person 
    inlines = (AddressInLine,) 

class CompanyAdmin(admin.ModelAdmin): 
    and so on 

但是,这则意味着我不得不每人多个地址,并我的地址模型不再适合。

任何帮助将不胜感激。

回答

4

请尝试以下

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class Address(models.Model): 
    object_id = models.PositiveIntegerField() 
    content_type = models.ForeignKey(ContentType) 
    of   = generic.GenericForeignKey('content_type', 'object_id') 

class Person(models.Model): 
    pass 

class Store(models.Model): 
    pass 

class Company(models.Model): 
    pass 

然后,你可以这样做:

from django.contrib import admin 
from django.contrib.contenttypes import generic 

class AddressInline(generic.GenericStackedInline): 
    model = Address 
    max_num = 1 

class PersonAdmin(admin.ModelAdmin): 
    model = Person 
    inlines = (AddressInLine,) 

class CompanyAdmin(admin.ModelAdmin): 
    and so on 

admin.site.register(Person, PersonAdmin) 
+1

这对我有用:)谢谢 – 2011-12-22 03:32:59

+1

那么你现在如何将Person模型链接到Address?它仍然是一个正常的ForeignKey? – Greg 2013-06-11 15:30:37

2

将类AddressInline(admin.TabularInline)更改为类AddressInline(admin.StackedInline)将使地址内联看起来不像可能有几个。

如果每个AddressInline不超过1个地址,请将AddressInline.max_num设置为1。

如果您希望在没有相关地址时使用空白地址表单,请将AddressInline.extra设置为1。

文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-options

+0

是的,这限制了地址只是一个:)的数量。 – 2011-12-22 02:50:55