vistas urls template superusuario proyecto plantillas modelos manage createsuperuser crear python django django-admin inline one-to-one

python - urls - Administrador de Django: ¿La relación de OneToOne como en línea?



urls en django (4)

Estoy reuniendo al administrador para una aplicación de satchmo. Satchmo usa las relaciones de OneToOne para ampliar el modelo de Product base, y me gustaría editarlo todo en una página.

¿Es posible tener una relación OneToOne como Inline? Si no, ¿cuál es la mejor manera de agregar algunos campos a una página determinada de mi administrador que eventualmente se guardará 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) ...

Intenté 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)

Lo que arroja este error: <class ''satchmo.product.models.Product''> has no ForeignKey to <class ''my_app.models.MyProduct''>

¿Es la única forma de hacer esto un formulario personalizado ?

editar: Solo intenté con el siguiente código para agregar los campos directamente ... tampoco funciona:

class AlbumAdmin(admin.ModelAdmin): fields = (''product__name'',)


En referencia a la última pregunta, ¿cuál sería la mejor solución para múltiples subtipos? Ej. Clase Producto con clase de subtipo Libro y clase de subtipo CD. De la manera que se muestra aquí, debe editar un producto, los elementos generales más los elementos de subtipo para el libro Y los elementos del subtipo para el CD. Entonces, aunque solo quiera agregar un libro, también obtendrá los campos para CD. Si agrega un subtipo, por ejemplo, DVD, obtendrá tres grupos de campo de subtipo, mientras que en realidad solo desea un grupo de subtipos, en el ejemplo mencionado: libros.


Es perfectamente posible utilizar un en línea para una relación OneToOne. Sin embargo, el campo real que define la relación debe estar en el modelo en línea, no en el padre, de la misma manera que para una ForeignKey. Cambie y funcionará.

Editar después de comentar : dices que el modelo principal ya está registrado con el administrador: luego anular el registro y volver a registrarse.

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)


Tal vez use la herencia en lugar de la relación OneToOne

class Product(models.Model): name = models.CharField(max_length=100) ... class MyProduct(Product): .....

O usa clases 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, su producto estará en línea.