2011-03-09 14 views
7

Tengo un modelo (Entry), que contiene una propiedad sencilla:Django admin TabularInline: ¿hay una buena manera de agregar una columna html personalizada?

@property 
def image(self): 
     return str(self.id)+"_"+self.round.season.name+"_"+self.round.theme+"_"+self.person.name 

Lo utilizo para construir el nombre de un archivo de imagen en particular en el disco. Así que sé que va a haber una imagen en /path/to/images/(model.image()).jpg

Puedo mostrar la propiedad de imagen sin procesar en sí misma dentro del diseño de TabularInline en una página de administración agregándola a la colección readonly_fields, pero ¿cómo conseguiré una columna que ¿Tenía html personalizado envuelto alrededor de la propiedad del modelo?

p. Ej.

<img src="/images/{{model.image}}.jpg" /> 

Respuesta

10

Lo que puede hacer es crear un método en la subclase TabularInline que devuelve el HTML que desea, a continuación, utilizar el nombre de ese método en el lugar de image en ImageInline. fields:

from django.utils.safestring import mark_safe 

class ImageInline(admin.TabularInline): 
    ... 
    fields = (..., 'render_image') 

    def render_image(self, obj): 
     return mark_safe("""<img src="/images/%s.jpg" />""" % obj.image) 
+7

Cuando intento esto, obtengo '" Campo desconocido (s) (render_image) especificado para TheModelHere' – Matt

+14

@ Matt, eso es porque hay que especificar que sólo se lee: 'readonly_fields = (..., 'render_image') ' – dragostis

15

De acuerdo con Django actual 1.2+ llegué errores "Formulario No tiene campo como render_image". Solución es simple poner la función render_image en model.Admin no en su formulario en línea, segunda cosa es readonly_fields campos y ajustes en su formulario en línea ... Así que aquí tienes lo que yo he terminado con:

class OfferPropertyInline(admin.TabularInline): 
    model = OfferProperty 
    fields=('property_value',) 
    readonly_fields = ('property_value',) 

class OfferAdmin(admin.ModelAdmin): 
    inlines = [ 
     OfferPropertyInline 
    ] 

    def property_value(self,obj): 
     return obj.get_value() 

admin.site.register(Offer, OfferAdmin) 
+0

¡Esto es genial! Sin embargo, parece una ventaja en la implementación de django admin. Si puede funcionar en la clase base de administración, debería funcionar en línea también ... – xaralis

+3

Parece que no funciona en 1.4 – Ash

0

@lechup correcto, excepto que necesita:

readonly_fields = ('mycustomfield',) 

definido en la línea para las versiones posteriores de Django respuesta (+1,4)

0

de Lechup no funciona para mí, estoy usando Django 1.11.7. Encontré esta manera de evitarlo.

Digamos que tengo 2 tablas: Campaña y el artículo, una campaña tiene muchos artículos. Quiero mostrar los artículos cuando navego en una campaña específica.

Artículo de tabla tiene una columna llamada puntuación, que es un flotador. Quiero redondearlo hasta 2 decimales al visualizar en Django admin.

Este ejemplo muestra cómo puede crear una columna personalizada para TabularInline en Django admin.

class Article(models.Model): 
    title = models.TextField(null=False) 
    url = models.TextField()   
    score = models.FloatField(null=True) 

    def __str__(self): 
     return self.title 

    def display_score(self): 
     if self.score: 
      return round(self.score, 2) 
     return self.score 

    display_score.short_description = 'Score' 

class ArticleInline(admin.TabularInline): 
    model = Article 
    readonly_fields = ('title', 'url', 'display_score') 
    fields = ('title', 'url', 'display_score') 

class CampaignAdmin(admin.ModelAdmin): 
    inlines = [ArticleInline] 

admin.site.register(Campaign, CampaignAdmin) 
Cuestiones relacionadas