如何从 Django 模板中的外键访问值
Posted
技术标签:
【中文标题】如何从 Django 模板中的外键访问值【英文标题】:How do I access a value from a foreign key in Django template 【发布时间】: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 等
请帮忙,谢谢!
【问题讨论】:
【参考方案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 对我有用以上是关于如何从 Django 模板中的外键访问值的主要内容,如果未能解决你的问题,请参考以下文章