将数据通过渲染传递给模板

时间:2015-07-15 12:58:23

标签: python django

我可以将QuerySet的输出通过字典传递给我的模板(以及单个变量),但我真的很难理解如何最好地将数据发送回模板。

例如,我有新闻文章,我想创建一个月度链接。我的news模型有一个字段,例如news_monthyear = "2015/06"

我在news/views

中创建了以下功能
def build_news_archives():
    months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
    news_list = {}
    monthyear = News_Article.objects.order_by('news_monthyear').values('news_monthyear').distinct()
    for items in monthyear:
        year = items['news_monthyear'][:4]
        month = months[int(items['news_monthyear'][5:])-1]
        news_list[monthyear] = {'Year': year, 'Month' : month}
#    pdb.set_trace()
    return news_list

我尝试了各种技术来构建我的news_list变量,准备好传回模板,但是无法解决如何构建它以便我可以轻松访问数据。

我在URLConf使用的主要功能包含以下内容:

def news(request, pID=0):
    rDict = {}
    if pID == 0:
        p = News_Article.objects.all()[:10]
    else:
        p = get_object_or_404(News_Article, id=pID)
    rDict['news'] = p
    announcement = get_announcement()
    if not announcement == None:
        rDict['announcement'] = announcement
    rDict['sitenav'] = clean_url(request.path, ['"', "'"])
    rDict['menu'] = Menu.objects.all().order_by('menu_position')
    rDict['newsarchive'] = build_news_archives()
#    pdb.set_trace()
    return render(request, 'en/public/news.html', rDict)

我试图像这样访问我模板中的数据,但我显然遗漏了一些非常基本的东西。

  <ol class="list-unstyled">
  {% for archive in newsarchive %}
    <li>{{ archive.year }} + {{ archive.month }}</li>
  {% endfor %}
  </ol>

2 个答案:

答案 0 :(得分:1)

build_news_archive

<ol class="list-unstyled"> {% for monthyear, archive in newsarchive.items %} <li>{{ archive.year }} + {{ archive.month }}</li> {% endfor %} </ol> 返回的数据结构是一个对象。当迭代python(和django模板)中的对象时,默认情况下会迭代键

items

你可以通过在for循环中访问your_dict.items来调用django模板中的python proceed dict方法 https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#for

答案 1 :(得分:0)

尝试这可能有帮助

return render(request, 'en/public/news.html', locals())

<ol class="list-unstyled">
  {% for archive in rDict.newsarchive %}
    <li>{{ archive.year }} + {{ archive.month }}</li>
  {% endfor %}
  </ol>