Django Admin: Relación OneToOne como una línea?
-
20-09-2019 - |
Pregunta
Estoy preparando el administrador para una aplicación satchmo. Satchmo utiliza las relaciones OneToOne extender el modelo Product
base, y me gustaría editar todo en una sola página.
Es posible tener una relación OneToOne como una línea? Si no es así, ¿cuál es la mejor manera de añadir un par de campos a una determinada página de mi administración que con el tiempo se guarda en la relación OneToOne?
por ejemplo:
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(models.Model):
product = models.OneToOne(Product)
...
He intentado esto para mi administrador pero no funciona, y parece esperar una clave externa:
class ProductInline(admin.StackedInline):
model = Product
fields = ('name',)
class MyProductAdmin(admin.ModelAdmin):
inlines = (AlbumProductInline,)
admin.site.register(MyProduct, MyProductAdmin)
que arroja este error: <class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>
Es la única manera de hacer esto un formulario personalizado ?
editar Sólo probamos el siguiente código para agregar los campos directamente ... tampoco funciona:
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
Solución
Es perfectamente posible utilizar una línea para una relación OneToOne. Sin embargo, el campo real que define la relación tiene que ser el modelo en línea, no el padre uno - exactamente de la misma forma que para ForeignKey. Cambiar una y va a trabajar.
Edición después de comentario : usted dice que el modelo padre ya se ha registrado en el administrador:. A continuación, anular el registro y volver a registrar
from original.satchmo.admin import ProductAdmin
class MyProductInline(admin.StackedInline):
model = MyProduct
class ExtendedProductAdmin(ProductAdmin):
inlines = ProductAdmin.inlines + (MyProductInline,)
admin.site.unregister(Product)
admin.site.register(Product, ExtendedProductAdmin)
Otros consejos
En cuanto a la última pregunta, ¿cuál sería la mejor solución para múltiples subtipos. Por ejemplo la clase de producto con el libro de clase sub-tipo y clase de CD subtipo. La forma en que se muestra aquí se tendría que modificar un producto de los artículos generales, además de los elementos sub-tipo de libro y de la sub-tipo artículos para CD. Por lo tanto, incluso si sólo desea añadir un libro que también consigue los campos para CD. Si añade un sub-tipo, por ejemplo, DVD, usted consigue tres grupos de campos de tipo secundario, mientras que en realidad sólo quiere un grupo subtipo, en el ejemplo mencionado:. Libros
Tal vez utilizar la herencia en lugar relación OneToOne
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(Product):
.....
O utilizar clases de proxy
class ProductProxy(Product)
class Meta:
proxy = True
en admin.py
class MyProductInlines(admin.StackedInline):
model = MyProduct
class MyProductAdmin(admin.ModelAdmin):
inlines = [MyProductInlines]
def queryset(self, request):
qs = super(MyProductAdmin, self).queryset(request)
qs = qs.exclude(relatedNameForYourProduct__isnone=True)
return qs
admin.site.register(ProductProxy, MyProductAdmin)
En esta variante de su producto va a estar en línea.
También puede intentar establecer 'parent_link = True' en su OneToOneField?