【问题标题】:django template - displaying images in tabledjango 模板 - 在表格中显示图像
【发布时间】:2012-04-03 18:49:44
【问题描述】:

我无法在模板上显示图片(或图片链接)。除了在自定义模型方法中定义的图像“render_thumbnail”之外,其他一切都在模板上工作。我究竟做错了什么? -btw 当我只使用图像表时,render_thumbnail 可以在另一个模板上工作,并且正在使用 -images.render_thumbnail 显示。谢谢。

模型.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

查看.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>

【问题讨论】:

  • 你得到什么而不是图像?我怀疑你的&lt;img../&gt; 标签被无意中转义了。
  • 1.直接使用查询集,不附加values 2. 不要像'/media/'那样对src进行硬编码,尝试unicode(image.thumbnail)和image.thumbnail.url
  • 嘿 9000,我得到一个空白表格单元格,什么都没有,nada。
  • 尝试从 Python shell 调用你的 render_thumbnail()
  • 有些东西你没有在这里展示给我们。当您尝试包含image__render_thumbnail 时,Listing.objects.values 调用将失败并显示FieldError,因为render_thumbnail 是一种方法,而不是一个字段。

标签: python html django django-templates


【解决方案1】:

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

如文档所述:

django-tables2 简化了将数据集转换为 HTML 的任务 表。它具有对分页和排序的本机支持。它为 HTML 表格 django.forms 对 HTML 表单的作用。例如

它的特点包括:

  • 任何可迭代对象都可以是数据源,但包括对 Django 查询集的特殊支持。
  • 内置 UI 不依赖于 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 %}

这个例子显示 最简单的情况之一,但 django-tables2 可以做的更多!查看 更多详情请关注documentation

也可以使用字典代替查询集。

为了在表格单元格中显示图像,您可以使用自定义表格列 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标签。

【讨论】:

  • Rasmus .. 感谢您告诉我有关 django-tables2 的信息。我会看看。我一直在考虑数据表,但还没有做出任何决定。
  • 如果您的意思是 jQuery lib datatables.net,最好的决定是同时使用它们。 Django-table2 将让您组织服务器端部分,数据表客户端部分。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2012-05-15
相关资源
最近更新 更多