如何从Django模板中的外键访问值

我已经阅读了所有相关主题,并且精疲力尽了我的研究,但我似乎无济于事。我将包含相关代码:


models.py


class Blog(models.Model):

  title = models.CharField(max_length=100, unique=True)

  slug = models.SlugField(max_length=100, unique=True)

  posted = models.DateTimeField(db_index=True, auto_now_add=True)

  body = models.TextField(blank=True)

  category = models.ForeignKey('myapp.Category')

  images = models.ForeignKey('myapp.Image')


  def __unicode__(self):

      return self.title


  @permalink

  def get_absolute_url(self):

      return ('teensite.myapp.views.view_post', None, {'slug': self.slug})


class Image(models.Model):


  def content_file_name(instance, filename):

      return os.path.join(MEDIA_ROOT, filename)


  title = models.CharField(max_length=60, blank=True, null=True)

  number = models.IntegerField()

  image = models.FileField(upload_to=content_file_name)

  body = models.TextField(blank=True)

  citation = models.URLField(blank=True)

  created = models.DateTimeField(auto_now_add=True)


  def save(self, *args, **kwargs):

      """Save image dimensions."""

      super(Image, self).save(*args, **kwargs)

      im = PImage.open(os.path.join(MEDIA_ROOT, self.image.name))

      self.width, self.height = im.size

      super(Image, self).save(*args, ** kwargs)


  def __unicode__(self):

      return self.image.name


  def size(self):

      """Image size."""

      return "%s x %s" % (self.width, self.height)


  def get_absolute_url(self):

      return ('http://www.teensdigest.com/media/'+self.image.name)

views.py


def home(request):

  return render(request, 'home.html', {'cats': Category.objects.all(),

                                         'blogs' : reversed(Blog.objects.all()),

                                          })


我需要home.html模板才能在blog.images中显示第一个图像。问题在于{{pic.get_absolute_url}}的其余模板均按预期方式呈现,但是{{pic.get_absolute_url}}没有返回值。我尝试了其他方法来访问Image模型中的其他值,但它们都无法像{{blog.images.all.0.title}}等那样工作。


慕丝7291255
浏览 466回答 2
2回答

慕勒3428872

模型中的images字段与关联,但是您将其视为关联(根据模板中的判断)。BlogForeignKeyImageManyToMany{% with blog.images_set.all ... %}根据您对关系的建模方式,您可以将images字段更改为:images = models.ForeignKey('myapp.Image')到images = models.ManyToManyField('myapp.Image')迁移数据库,然后您可以使用{% with blog.images.all ... %}在您的模板中。这将表明一个博客可以具有多个图像,并且一个图像可以属于多个博客。或者,您可以将关系移动到Image模型:class Image(models.Model):     ...     blog = models.ForeignKey(Blog)并使用: {% with blog.image_set.all ... %}在您的模板中(请参阅反转文档中的关系)。这将表明一个博客可以具有多个图像,但是只有一个图像属于一个博客文章。

白板的微信

您的模型坏了。按照您的方式,一个图像可以有多个博客,但一个博客只能有一个图像。您需要反过来,因此应该在Blog模型上定义ForeignKey,指向Image。然后您的模板将按原样工作。进一步说明:请不要获取所有Blog,然后再调用reversed它们。那简直太低效了。相反,让数据库以相反的顺序返回它们:Blog.objects.all().reverse()更好的是,在模型上定义创建时间字段并以此顺序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python