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',)
¿Fue útil?

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?

https: // docs .djangoproject.com / en / dev / temas / db / modelos / # especificando-la-padre-link-campo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top