1

我是 Python 和 Django 的新手。我有一个困扰我的基本 python/django ORM 问题。我有两个模型,它们有一个重复的 show_image 函数。那不好。

class Dinner(models.Model):

    title = models.CharField(max_length=200)
    is_approved = models.BooleanField()
    hero = models.ImageField(upload_to="heros", blank=True)

    def show_image(self):
        image_url = None
        if self.hero is not None:
            image_url = """<img src="{0}{1}" />""".format(BASE_URL, self.hero)
        return image_url

    show_image.short_description = "Thumbnail"
    show_image.allow_tags = True

class Speaker(models.Model):

    title = models.CharField(max_length=200)
    biography = models.TextField(blank=True)
    headshot = models.ImageField(upload_to="headshots", blank=True)

    def show_image(self):
        image_url = None
        if self.headshot is not None:
            image_url = """<img src="{0}{1}" />""".format(BASE_URL, self.headshot)
        return image_url

    show_image.short_description = "Thumbnail"
    show_image.allow_tags = True

看起来很简单——我决定开始试验。我在models.py中创建了一个方法...

def test(obj):
  print obj

然后在我的模型中我尝试了:

test(self.hero)

并得到了这个(而不是值):

 django.db.models.fields.files.ImageField

如何从中获取值,以便检查 ImageField 是否已被填充?

编辑:

class Speaker(models.Model):

    title = models.CharField(max_length=200)
    biography = models.TextField(blank=True)
    headshot = models.ImageField(upload_to=upload_to, blank=True)

    test(headshot)

    def show_image(self):
        image_url = None
        if self.headshot is not None:
            image_url = """<img src="{0}{1}" />""".format(BASE_URL, self.headshot)
        return image_url

    show_image.short_description = "Thumbnail"
    show_image.allow_tags = True
4

1 回答 1

3

您在类级别调用该测试方法,这是没有意义的。这意味着它在定义模型类时执行,这就是您看到字段类的原因。定义模型时会发生很多元类的事情,因此当您获得实例时,您会看到值,而不是字段类 - 但在您调用方法时并没有发生这种情况。

在任何情况下,您都需要使用模型的实例来调用它,以便实际上有一个值要处理。

我怀疑您对 Python 还很陌生,所以这里有一个提示:您可以从 Python shell 中检查所有这些内容。开始./manage.py shell,然后导入您的模型,实例化一个(或从数据库中获取它),然后您可以检查它dir()等等。比在代码中编写调试函数效率更高。

于 2013-08-14T16:50:27.230 回答