我只是找不到我做错了什么。这是我的装置
from django.db import models
from django.conf import settings
"""
Simple model to handle blog posts
"""
class Category(models.Model):
def __unicode__(self):
return self.name
name = models.CharField(max_length=50)
class BlogEntry(models.Model):
def __unicode__(self):
return self.blog_post_name
blog_post_name = models.CharField(max_length=200)
blog_post_content = models.CharField(max_length=1024)
blog_pub_date = models.DateTimeField(auto_now=True)
blog_post_image = models.ImageField(upload_to = settings.MEDIA_ROOT, default = '/media_files/douche.jpg')
blog_post_category = models.ForeignKey(Category)
views.py
from django.shortcuts import render
from blog_post.models import BlogEntry, Category
from blog_post.forms import BlogPostForm
from django.shortcuts import HttpResponseRedirect
from time import gmtime, strftime
"""
This method will display all user posts (newest first)
"""
def home(request):
blog_template = "blogs.html"
list_all_posts = BlogEntry.objects.all().order_by('-blog_pub_date').values() # List all posts on DB ordered by date (newest first).
return render(request, blog_template, locals())
在模板上,我可以访问blog_post_category_id的值,但我想显示类别的实际名称。
我试过模板set.all
{% extends "base.html" %}
{% load split_string %}
{% block content %}
<div class="row">
<div class="large-6 columns">
{% if list_all_posts %}
{% for post in list_all_posts %}
<ul class="pricing-table">
<li class="title">{{ post.blog_post_name }}</li>
<li class="bullet-item">
<a class="fancybox" href="/media_files/{{ post.blog_post_image|img_path_last_value:'/' }}" title="{{ post.blog_post_content }}" >
<img src="/media_files/{{ post.blog_post_image|img_path_last_value:'/' }}" alt="" />
</a>
</li>
{% for cat in post.category_set.all %}
<li class="price">{{ cat.category_name }}</li>
{% endfor %}
<li class="description">{{ post.blog_post_content}}</li>
</ul>
{% endfor %}
{% endif %}
</div>
</div>
{% endblock %}
有人能解释一下这件事吗?
提前谢谢。
发布于 2013-08-07 22:30:33
来自文档
.values() Returns a ValuesQuerySet — a QuerySet subclass that returns dictionaries when used as an iterable, rather than model-instance objects.
这意味着您将无法调用post.category_set.all
,因为post是一个字典而不是模型实例,您需要指定字典中包含的字段,当您这样做时,您可以包括blog_post_category__name
,它将在模板中显示类别名称。
发布于 2013-08-08 00:00:18
list_all_posts = BlogEntry.objects.all().order_by('-blog_pub_date').values()
您必须理解,当您在查询集上执行.values()
时,Django收集来自SQL关系的值,并将其存储在一个字典中。因此,是存储外键的ID,但任何其他信息都丢失了!
所以你周围有很多工作。以下是两种解决方案:
1)将填充给定数据的dict返回给模板:
例如:.values('blog_post_name', 'blog_post_category__name')
2)返回只包含所需数据的查询集
例如:.only('blog_post_name').select_related('blog_post_category__name')
当您试图在queryset的模板中显示类别名称时,select_related是为了避免Django再次调用DB
https://stackoverflow.com/questions/18119119
复制相似问题