2012-04-01 74 views
0

我无法获取要在模板上显示的图像(或图像链接)。其他所有内容都在模板上工作,但图像“render_thumbnail”在自定义模型方法中定义。我究竟做错了什么? -btw当我仅使用Images表格工作时,render_thumbnail在另一个模板上工作,并使用 - images.render_thumbnail进行显示。谢谢。django模板 - 在表格中显示图像

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) 

模板表

<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

你得到什么而不是图像?我怀疑你的''标签被无意中逃脱了。 – 9000 2012-04-01 01:03:55

+1

1.直接使用queryset不带附加'values' 2.不要硬编码src就像'/ media /',试试unicode(image.thumbnail)和image.thumbnail.url – okm 2012-04-01 01:05:40

+0

hey 9000,我得到一个空白表格单元格,就像没有任何事情一样,纳达。 – BillB1951 2012-04-01 01:35:52

回答

2

如果你想使你的代码更简单,我想建议使用ap折012 django-tables2。这种方法可以解决您关于生成表的所有问题。

由于文档赛斯:

Django的tables2简化转弯组数据转换成HTML 表的任务。它具有对分页和排序的本机支持。它为 HTML表格提供了django.forms为HTML表单所做的工作。例如

它的特点包括:

  • 任何迭代可以是一个数据源,但包括用于Django的查询集的特殊支持。
  • 内置用户界面不依赖于JavaScript。
  • 支持基于Django模型的自动表格生成。
  • 通过子类别支持自定义列功能。
  • 分页。
  • 基于列的表格排序。
  • 模板标签,可以将简单的渲染转换为HTML。
  • 在Django 1.3中使用的通用视图mixin。

创建表格很简单,只要:

import django_tables2 as tables 

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

这然后将在视图中使用:

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

最后在模板:

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

这个例子显示了 最简单的情况之一,但是d jango-tables2可以做更多!查看 了解更多详情,请点击documentation

也可以使用字典代替queryset。

处理表格单元格显示图像,你可以使用自定义表列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) 

或以同样的方式创造新的ImageColumn和只传送SRC属性,而不是整个IMG标签。

+0

Rasmus ..感谢您告诉我关于django-tables2。我会看看。我一直在考虑数据表,但还没有做出任何决定。 – BillB1951 2012-04-05 01:08:26

+0

如果你的意思是jQuery lib http://datatables.net/,最好的决定是使用它们两个。 Django-table2将让你组织服务器端部分,数据表的客户端部分。 – ramusus 2012-04-08 12:27:56