为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2021-03-14 15:11:53
我已经阅读了所有相关主题,并且精疲力尽了我的研究,但我似乎无济于事。我将包含相关代码:models.pyclass 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.pydef 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}}等那样工作。
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

模型中的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 ... %}

在您的模板中(请参阅反转文档中的关系)。这将表明一个博客可以具有多个图像,但是只有一个图像属于一个博客文章。


查看完整回答
反对 回复 2021-03-30
?
白板的微信

TA贡献1883条经验 获得超3个赞

您的模型坏了。按照您的方式,一个图像可以有多个博客,但一个博客只能有一个图像。您需要反过来,因此应该在Blog模型上定义ForeignKey,指向Image。然后您的模板将按原样工作。

进一步说明:请不要获取所有Blog,然后再调用reversed它们。那简直太低效了。相反,让数据库以相反的顺序返回它们:

Blog.objects.all().reverse()

更好的是,在模型上定义创建时间字段并以此顺序。


查看完整回答
反对 回复 2021-03-30
  • 2 回答
  • 0 关注
  • 464 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信