2012-04-01 7 views
0

Ich kann keine Bilder (oder Bildlinks) auf der Vorlage anzeigen lassen. Alles andere arbeitet an der Vorlage, aber das Bild "render_thumbnail", das in einer benutzerdefinierten Modellmethode definiert ist. Was mache ich falsch? -btw die render_thumbnail arbeitet an einer anderen Vorlage, wenn ich nur mit der Bilder Tabelle arbeite, und werde mit - images.render_thumbnail anzeigen. Vielen Dank.Django-Vorlage - Anzeige von Bildern in der Tabelle

Models.py

class Listings(models.Model): 
    createdate = models.DateTimeField(auto_now_add=True) 
    expirydate = models.DateTimeField(null=True, blank=True) 
    price = models.IntegerField(null=True, blank=True) 
    broker_y_n = models.CharField(max_length=1, blank=True, choices=broker, default='n') 
    listing_type = models.ForeignKey(ListingType) 
    listing_status = models.ForeignKey(ListingStatus, default=3) 
    customer = models.ForeignKey(Customer) 

class Image(models.Model): 
    title = models.CharField(max_length=60, blank=True, null=True) 
    image = models.ImageField(upload_to="images/", blank=True, null=True) 
    thumbnail = models.ImageField(upload_to="images/", blank=True, null=True) 
    thumbnail2 = models.ImageField(upload_to="images/", blank=True, null=True) 
    #tags = models.ManyToManyField(Tag, blank=True) 
    #albums = models.ManyToManyField(Album, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    #rating = models.IntegerField(default=50) 
    width = models.IntegerField(blank=True, null=True) 
    height = models.IntegerField(blank=True, null=True) 
    listings = models.ForeignKey(Listings) 
    def save(self, *args, **kwargs): 
     # Save image dimensions 
     super(Image, self).save(*args, **kwargs) 
     im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 
     self.width, self.height = im.size 
     # large thumbnail 
     fn, ext = os.path.splitext(self.image.name) 
     im.thumbnail((256,256), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb2" + ext 
     tf2 = NamedTemporaryFile() 
     im.save(tf2.name, "JPEG") 
     self.thumbnail2.save(thumb_fn, File(open(tf2.name)), save=False) 
     tf2.close() 
     # small thumbnail 
     im.thumbnail((60,60), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb" + ext 
     tf = NamedTemporaryFile() 
     im.save(tf.name, "JPEG") 
     self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False) 
     tf.close() 
     super(Image, self).save(*args, **kwargs) 
    def size(self): 
     # Image size # 
     return "%s x %s" % (self.width, self.height) 
    def render_thumbnail(self): 
     return mark_safe("""<a href = "/media/%s"><img border="0" alt=""  src="/media/%s" /></a>""" % ((self.image.name, self.thumbnail.name))) 
    #render_thumbnail.allow_tags = True 
    def render_thumbnail2(self): 
     return mark_safe("""<a href = "/media/%s"><img border="0" alt="" src="/media/%s" /></a>""" % ((self.image.name, self.thumbnail2.name))) 
    #render_thumbnail.allow_tags = True 
    def __unicode__(self): 
    return self.image.name 

View.py

def details_customer(request, user_id): 
    customer = get_object_or_404(Customer, user=user_id) 
    cusnum=customer.id 
    image = Image.objects.all()  
    listings = Listings.objects.filter(customer=cusnum).values(
     'id', 
     'price', 
     'listing_type__desc', 
     'listing_status', 
     'listing_status__desc', 
     'canoekayak__builder', 
     'image__title', 
     'image__thumbnail', 
     'image__render_thumbnail',   
     ) 
    context = Context({ 
     'title': 'Details', 
     'customer': customer, 
     'image' : image,   
     'listings' : listings, 
     }) 
    return render_to_response('bsmain/details.html', context) 

Vorlage Tabelle

<TABLE id="some_id">  
<TBODY> 
    {% load humanize %} 
    {% for row in listings %} 
    <tr> 
     <td>{{ row.id }}</td> 
     <td align="right">{{row.price|intcomma}}</td> 
     <td>{{ row.listing_type__desc}}</td> 
     <td>{{ row.listing_status}}</td> 
     <td>{{ row.listing_status__desc}}</td> 
     <td>{{ row.canoekayak__builder}}</td> 
     <td>{{ row.image__title}}</td> 
     <td>{{ row.image__thumbnail}}</td 
     <td>{{ row.image__render_thumbnail}}</td    
    </tr> 
    {% endfor %} 
</TBODY> 

+1

Was bekommen Sie anstelle der Bilder? Ich vermute, dass Ihr "" -Tag unbeabsichtigt entkommen kann. – 9000

+1

1. benutze queryset direkt ohne "values" 2. dont hardcode src wie '/ media /', versuche Unicode (image.thumbnail) und image.thumbnail.url – okm

+0

hey 9000, bekomme ich eine leere Tabelle Zelle, wie in nichts, nada. – BillB1951

Antwort

2

Wenn Sie Ihren Code einfacher zu machen, würde Ich mag an empfehlen zu verwenden ap Anwendung django-tables2. Dieser Ansatz kann alle Ihre Probleme beim Generieren von Tabellen lösen.

Als Dokumentation sais:

django-tables2 vereinfacht die Aufgabe der Tabellen Sätze von Daten in HTML drehen. Es bietet native Unterstützung für Paginierung und Sortierung. Es tut für HTML-Tabellen, was django.forms für HTML-Formulare tut. z.B.

Seine Eigenschaften umfassen:

  • Jede iterable eine Datenquelle sein kann, aber spezielle Unterstützung für Django querysets enthalten ist.
  • Die integrierte Benutzeroberfläche ist nicht auf JavaScript angewiesen.
  • Unterstützung für automatische Tabellengenerierung basierend auf einem Django-Modell.
  • Unterstützt benutzerdefinierte Spaltenfunktionalität über Unterklassen.
  • Paginierung.
  • Spaltenbasierte Tabellensortierung.
  • Template-Tag, um triviales Rendering in HTML zu ermöglichen.
  • Generische Ansicht Mixin für den Einsatz in Django 1.3.

eine Tabelle zu erstellen ist so einfach wie:

import django_tables2 as tables 

class SimpleTable(tables.Table): 
    class Meta: 
     model = Simple 

Dies würde dann in einer Ansicht verwendet werden:

def simple_list(request): 
    queryset = Simple.objects.all() 
    table = SimpleTable(queryset) 
    return render_to_response("simple_list.html", {"table": table}, 
           context_instance=RequestContext(request)) 

Und schließlich in der Vorlage:

{% load django_tables2 %} 
{% render_table table %} 

Dieses Beispiel zeigt einen der einfachsten Fälle, aber d jango-tables2 kann noch viel mehr! Überprüfen Sie aus der documentation für weitere Details.

Es ist auch möglich, Wörterbuch anstelle von queryset zu verwenden.

Für Bilder in Tabellenzellen, die Sie benutzerdefinierte Tabellenspalt HtmlColumn

from django.utils.safestring import mark_safe 
import django_tables2 as tables 

from pytils.numeral import get_plural 
class HtmlColumn(tables.Column): 
    def render(self, value): 
     return mark_safe(value) 

oder neuen ImageColumn in der gleichen Art und Weise verwenden können, und übertragen nur src Attribute, statt ganzen img Tag.

+0

Rasmus .. danke, dass du mir von django-tables2 erzählt hast. Ich werde es mir ansehen. Ich habe über Datenblätter nachgedacht, aber noch keine Entscheidungen getroffen. – BillB1951

+0

Wenn Sie jQuery lib http://datatables.net/ meinen, ist die beste Entscheidung, beide zu verwenden. Mit Django-table2 können Sie serverseitige Teil- und Datatabellen clientseitigen Teil organisieren. – ramusus

Verwandte Themen