【问题标题】:How do I access a value from a foreign key in Django template如何从 Django 模板中的外键访问值
【发布时间】:2013-06-01 22:40:57
【问题描述】:

我已经阅读了所有相关的主题,并且已经用尽了我的研究,但我所做的似乎没有任何效果。我将包含相关代码:

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

{% for blog in blogs %}
  {% with blog.images_set.all|first as pic %}
      <div class="gal_grid_item" href="{{ blog.get_absolute_url }}">
      <a class="gal_grid_image_wrapper" href="{{ blog.get_absolute_url }}">
      <img class="gal_grid_image" src="{{ pic.get_absolute_url }}" />
      </a>
      <a class="gal_grid_info" href="{{ blog.get_absolute_url }}">
      <p class="gal_title text-center">{{ blog.title }}</p>
      </a>
      </div>
  {% endwith %}
{% endfor %}

我需要 home.html 模板来显示 blog.images 中的第一张图片。问题在于 {{ pic.get_absolute_url }} 模板的其余部分按预期呈现,但 {{ pic.get_absolute_url }} 没有返回值。我尝试过其他方法来访问 Image 模型中的其他值,但它们都不像 {{ blog.images.all.0.title }} 等

请帮忙,谢谢!

【问题讨论】:

    标签: python django django-models django-templates foreign-keys


    【解决方案1】:

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

    进一步注意:请不要获取所有博客,然后在它们上调用reversed。这是非常低效的。相反,让数据库以相反的顺序返回它们:

    Blog.objects.all().reverse()
    

    更好的是,在模型上定义一个创建时间字段并按此排序。

    【讨论】:

      【解决方案2】:

      Blog 模型中的images 字段与Image 具有ForeignKey 关系,但您将其视为ManyToMany 关系(根据模板中的{% 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 ... %}
      

      在您的模板中 (see reversing the relationships in the docs)。这表明一个博客可以有多个图像,但一个图像只属于一个博客文章。

      【讨论】:

      • 谢谢,将关系更改为 ManyToMany 对我有用
      猜你喜欢
      • 2012-06-07
      • 2012-05-28
      • 2015-04-25
      • 2021-08-03
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      相关资源
      最近更新 更多