2011-12-22 14 views
8

Decir que tengo algunos modelos de Django, algo como esto:inlines inversa en Django admin con más de un modelo

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) 

Así, en la interfaz de administración, me gustaría ser capaz de editar una persona y tener la dirección alineada.

Sé que es posible hacer esto,

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 

entonces puedo hacer lo habitual,

class AddressInline(admin.TabularInline): 
    model = Address 

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

class CompanyAdmin(admin.ModelAdmin): 
    and so on 

Pero esto, entonces significa que tendría más de una dirección por persona, y mi modelo de Dirección ya no se siente bien.

Cualquier ayuda será apreciada.

Respuesta

4

Pruebe lo siguiente

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 

entonces usted puede hacer esto:

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

Eso va a funcionar para mí :) Gracias –

+1

Entonces, ¿cómo vinculas ahora el modelo de persona a la dirección? ¿Sigue siendo una ForeignKey normal? – Greg

2

Cambiar la clase AddressInline (admin.TabularInline) a la clase AddressInline (admin.StackedInline) hará que la dirección en línea se vea menos como si fuera posible tener varias.

Establezca AddressInline.max_num en 1 si desea no más de 1 dirección por AddressInline.

Establezca AddressInline.extra en 1 si desea un formulario de dirección en blanco cuando no hay una Dirección relacionada.

Documentación: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-options

+0

Sí, que limita el número de direcciones a una sola :). –

Cuestiones relacionadas